home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / fpl-v13.lha / fpl / docs / FPLuser.doc < prev    next >
Text File  |  1995-05-25  |  150KB  |  4,240 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.                                      FPL
  7.  
  8.  
  9.                                    Version
  10.                                      11.6
  11.  
  12.  
  13.  
  14.  
  15.                                Daniel Stenberg
  16.  
  17.  
  18.  
  19.                             1993-1995 by FrexxWare
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.                          Generated with Heddley v1.1
  37.                       Heddley v1.1 (C) Edd Dumbill 1994
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.                                   - Page 1 -
  77.  
  78.  
  79.  
  80. 1.    FPL Users Documentation
  81.  
  82.  FPL is Copyright © 1992-1995 by FrexxWare. Permission is granted to freely
  83. distribute this program for non-commercial purposes only. FPL is distributed
  84. "as is" without warranty of any kind.
  85.  
  86.  This documents the FPL language as it runs from version 11. If you happen to
  87. use any lower version, upgrade!
  88.  
  89. -------------------------------------------------------------------------
  90.  
  91.   FPL is very similar to C. If you know C, then FPL is very fast to learn!
  92.  
  93.         Parts of the language:
  94.  
  95.      General           
  96.      Expressions       
  97.      Functions         
  98.      Keywords          
  99.      Line control      
  100.      Statements        
  101.      Strings           
  102.      Variables         
  103.      Pragmas            (New from version 8)
  104.     
  105.      Funclibs           [Amiga only]
  106.  
  107.         Subsequent information:
  108.  
  109.      About this manual 
  110.      Error messages    
  111.      Examples          
  112.      Hints and tricks  
  113.      How to reach us   
  114.  
  115. -------------------------------------------------------------------------
  116.  
  117. For more information about the FPL distribution:  General information  
  118.  
  119. And for programmers that want to implement FPL library support:
  120.  FPL implementation  
  121.  
  122. 2.    About this manual
  123.  
  124.  This is the FPL LANGUAGE documentation. This deals with about everything that
  125. can be said about FPL from the user's view. For information about how to
  126. implement fpl.library in your own code, see the FPLlib.guide and fpl.doc
  127. files.
  128.  
  129.  Many examples provided are from the FrexxEd environment, meaning that several
  130. of the used functions in the examples are FrexxEd specific and not a part of
  131. FPL. (FrexxEd is Copyright © 1992-1994 by FrexxWare.)
  132.  
  133.  There should be sufficient information in this manual to allow every user to
  134. fully understand and use FPL. If it should prove unsufficent, report it!
  135.  
  136.  TECH Notes exist in some parts of the manual, explaining why I solved things
  137. the way I did and sometimes also how.
  138.  
  139.  This documentation is written during a long time and during a lot of FPL
  140. updates. There might still be some old version thinking in this manual, but I
  141. hope it won't destroy your ability to create something good with FPL.
  142.  
  143.  This manual does only handle the language FPL. When FPL is used in real life,
  144. it will always be used in a software which is host to FPL. That software will
  145. affect FPL a lot and you should read the FPL chapters of that software's
  146.  
  147.                                   - Page 2 -
  148. 2.    About this manual
  149.  
  150. documentation closely!
  151.  
  152. 3.    How to reach me
  153.  
  154.  For private matters/discussions/questions/ideas, drop me a email/netmail at
  155. our own BBS: The Holy Grail (+46-(0)8-6121258, FidoNet 2:201/328, running
  156. 28800 bps V34), or reach me at email: Daniel.Stenberg@sth.frontec.se!
  157.  
  158.  Problems concerning FPL, the library, bug reports, other FrexxWare products
  159. or stuff like that, are dedicated to public message areas  making it possible
  160. for everyone to share, learn and participate.
  161.  
  162.  If you have any ideas about things you'd like FPL to support, handle or run,
  163. don't hesitate to contact me and share your visions. FPL is continuously
  164. developing and I need feedback to know in which directions you want it to go.
  165.  
  166.  Swedish users of FPL can take advantage of the FidoNet echo mail area named
  167. R20_FPL. Available on backbone.
  168.  
  169.  If there is enough interest shown, I will consider arranging a standard
  170. internet mailing list for FPL discussions.
  171.  
  172.  All forthcoming updates and releases will be uploaded as fast as possible to
  173. the public ftp site known as AmiNet. (Thanks to Mattias Axelsson for his
  174. offering to do this on a regular basis!)
  175.  
  176.  I'm very often on IRC, using the nick name 'Bagder', meet me there!
  177.  
  178.  Source code is very much available and if you didn't get it in the package,
  179. get in touch!
  180.  
  181.   Snail mail address:
  182.  
  183.         Daniel Stenberg
  184.         Ankdammsgatan 36, 4tr
  185.         S-17143 SOLNA
  186.         Sweden
  187.  
  188. 4.    General
  189.  
  190. * Every execution begins at the top of the program and interprets from
  191.   left to right, downwards.
  192.  
  193. * All statements must be separated with a semicolon (;).
  194.  
  195. * FPL is case sensitive. That makes the following two variable names
  196.   different:
  197.  
  198.     hello  Hello
  199.  
  200. * There is no maximum length of a script line. In fact, the entire
  201.   program is indeed as good in one single line as in several lines.
  202.  
  203. * There is no line orientation in the language at all. Programs can be
  204.   written in almost any way provided that you follow the syntax rules
  205.   of the  keywords  and  functions . Whitespaces, comments and new lines
  206.   can be inserted anywhere to make the code more appealing to you.
  207.  
  208. * Comments are allowed everywhere and are written exactly as in C and
  209.   Arexx as well as in C++; starting with a "/*" and ending with a "*/"
  210.   with no nesting possibilities(1):
  211.  
  212.     /* This is a comment */
  213.  
  214.   or starting with a "//" symbol and ending with a new line. Ex:
  215.  
  216.     // This is also a comment
  217.  
  218.                                   - Page 3 -
  219. 4.    General
  220.  
  221.  
  222.   (Kjell, I hope you're really happy with this feature!)
  223.  
  224.   (1) - Since version 7, FPL can be made to accept nested comments.
  225.  
  226. * Continuation of string lines is written with a backslash (\)
  227.   character followed by a newline. Ordinary statements don't need
  228.   any continuation character at all. Just as in C... ;-) Ex:
  229.  
  230.   a=b                   /* This is a fully working statement */
  231.    >
  232.    c;
  233.  
  234.   b="hello\
  235.   world";               /* Continues a string assign.*/
  236.  
  237.   output                /* Split the name and the arguments... */
  238.   ("hi");
  239.  
  240.  
  241.   /* The code below works just fine, but writing much of this */
  242.   /* kind might make your code rather confusing! */
  243.   output(\
  244.   "h\
  245.   ello\
  246.    wor\
  247.   ld"\
  248.   );
  249.  
  250.   (In 'C' you can continue *EVERYTHING* by simply writing a backslash
  251.   and continue on the next line (thanks to the preprocessor that merges
  252.   such lines into one for the compiler). FPL cannot perform the same
  253.   if you're not using FPL together with a preprocessor that replaces
  254.   such sequences (such as FPP, the FrexxWare Pre Processor).)
  255.  
  256. * All identifier names (labels/functions/variables) is limited to no
  257.   more than 64 significant characters. More characters can be used, but
  258.   identifiers with the same 64 first characters are considered
  259.   identical.
  260.  
  261. * Identifiers can consist of both letters, numbers and underscores
  262.   ("_") but must not begin with a number. Letters are the 26 characters
  263.   from a to z and the 26 characters from A to Z.
  264.  
  265. * There is no kind of unconditional jump or goto in FPL. In languages
  266.   like this (with different local levels), goto is most frequently
  267.   used in the wrong way and the use of it should anyhow have been very
  268.   limited (just look at the goto function in C). FPL doesn't need any
  269.   goto/jump keyword.
  270.  
  271. * Do not, I repeat, do not rely on undocumented features in the
  272.   language. FPL is constantly being changed and new error checks might
  273.   be implemented in the next release. The strange feature you may find
  274.   working in this version, might be a sever error in the next.
  275.   Code as stated in the manual and your FPL code will have a much
  276.   bigger change to stay accurate even when the version number ascends.
  277.  
  278. 5.    Funclibs
  279.  
  280.    Overview
  281.    ~~~~~~~~
  282.  To enable third party programs to add functions to already running FPL
  283. sessions, the 'funclib' concept was invented. The inspiration source when
  284. designing the interface was to make it work like when using shared libraries
  285. (known as dynamic linking in some systems).
  286.  
  287.  Using this technique, all FPL programmers can take advantage of functions
  288.  
  289.                                   - Page 4 -
  290. 5.    Funclibs
  291.  
  292. that is placed in funclibs. By simply opening the funclib all its functions
  293. will exist and can get called. Any FPL program can open any funclib.
  294.  
  295.  Funclibs could contain functions for bringing up requesters easier, for
  296. compression procedures, for serial port communication or for file handling.
  297. The limits are set by the funclib programmer, not by anyone else!
  298.  
  299.     How to?
  300.     ~~~~~~~
  301.  By opening the desired funclib with the  openlib  function, all function will
  302. be there. There's nothing more to it than that!
  303.   After you've called the functions you wanted the funclib for, you simply
  304. call  closelib  which concludes access to that funclib.
  305.  
  306.  In some occasions, the host program might have already opened a funclib for
  307. you, and then you won't need to open it and you shouldn't close it.
  308.  
  309. 6.    Line Control
  310.  
  311.  I encourage the use of preprocessors together with FPL. FPL interprets the
  312. ANSI C standard "#line" instruction as a line number/file name changer.
  313.  
  314.     #line
  315.     =====
  316.  
  317.  A line control directive that supplies line numbers for FPL messages. It
  318. causes the next source line to be treated as having the specified number.
  319.  
  320.  Syntax
  321.  
  322. # line { decimal_constant [ "file_name" ] }
  323.  
  324.  In order for FPL to produce meaningful references to line numbers in
  325. preprocessed source, the preprocessor inserts #line directives where necessary
  326. (for example, at the beginning at after the end of included text).
  327.  
  328.  A file name specification enclosed in double quotation marks can follow the
  329. line number. If a file name is specified, FPL views the next line as part of
  330. the specified file. If a file name is not specified, FPL views the next line
  331. as part of the current source file.
  332.  
  333.  Note that the keyword 'line' is optional.  The directive
  334.  
  335.         # line 300
  336.  
  337.  is equivalent to
  338.  
  339.         # 300
  340.  
  341.  Example:
  342.  
  343.  On Amiga, an FPL source could be preprocessed using SAS/C 6.x by entering the
  344. following line:
  345.  
  346.   "sc PPONLY KEEPLINES <FPL program>"
  347.  
  348.  (note that if 'KEEPLINES' isn't specified, SAS/C won't output any #line
  349.   instructions!)
  350.  
  351. 7.    Pragmas in FPL
  352.  
  353. Pragmas are specified by entering
  354.  
  355.         #pragma <keyword>
  356.  
  357. first in a line, and where the <keyword> is a compiler specific instruction.
  358. FPL supports the following pragmas:
  359.  
  360.                                   - Page 5 -
  361. 7.    Pragmas in FPL
  362.  
  363.  
  364. (NOTE: do only use the pragmas if you are very certain of what they are doing,
  365. they alter settings done by the FPL implementor.)
  366.  
  367.  Keyword
  368.  -------
  369.  cache          Make FPL keep this file in memory after execution for faster
  370.                 access (it may very well do it anyway, depending on the FPL
  371.                 setup).
  372.  
  373.  nocache        Opposite to 'cache'. Make FPL to *not* keep this file in
  374.                 memory after usage, even if symbols were exported. The file
  375.                 will be loaded into memory each time it is to be used, and is
  376.                 flushed from memory when not in use.
  377.  
  378.  reread         When executing cached files, the original file might be
  379.                 changed. This pragma will force this file to be reread if
  380.                 it is changed on disk while another version is cached and
  381.                 then executed.
  382.  
  383.  noreread       The opposite to 'reread'. Force FPL to ignore if the file has
  384.                 been changed on disk or not.
  385.  
  386. 8.    Variables
  387.  
  388. * There exist a few kind of variables in FPL:
  389.  
  390.   integer       - holds a 32-bit signed numerical value.
  391.                   (maximum: 2147483647, minimum: -2147483648)
  392.                   Declarator: `int' or `long'
  393.  
  394.   short         - holds a 16-bit signed numerical value.
  395.                   (maximum: 32767, minimum: -32768)
  396.                   Declarator: `short'
  397.  
  398.   char          - holds an 8-bit signed numerical value.
  399.                   (maximum: 127, minimum: -128)
  400.                   Declarator: `char'
  401.  
  402.   string        - holds a contiguous sequence of characters.
  403.                   No length limit.
  404.                   Declarator: `string'. 
  405.  
  406.   Declare a varaible by using the declarator followed by the symbol name and
  407.   an optional initial assign. Multiple declarations can be done by comma
  408.   separating them.
  409.   Example:
  410.  
  411.   int a;
  412.   string b;
  413.   int a=2;
  414.   string foobar="ninja", foo, bar;
  415.  
  416.   Variables not assigned when declared, equals zero or zero length strings.
  417.  
  418. * FPL includes NO floating point variables at all. The secret of still
  419.   making proper calculations is the  remainder operator .
  420.   (Floating point numbers/expressions is expected to appear in a future FPL
  421.   version.)
  422.  
  423. * Variables can be declared to exist in a few different ways:
  424.  
  425.   `static'      - makes the variable to be remembered until the next time
  426. this
  427.                   function is invoked.
  428.   `const'       - constant variable. After the initialization assign, this
  429.                   cannot be changed.
  430.  
  431.                                   - Page 6 -
  432. 8.    Variables
  433.  
  434.   `auto' and
  435.   `register'    - make a varible declared as a global to exist as a non-
  436.                   global.
  437.   `volatile'    - volatile variables exist in C. They are written back to
  438.                   memory each time they are changed. FPL variables are always
  439.                   written back when changed. Implemented to make C ports
  440.                   easier.
  441.   `unsigned' and
  442.   `signed'      - not currently implemented. These words are simply read and
  443.                   ignored.
  444.  
  445.   These keywords can be used together with a declarator keyword in any
  446.   combination. Examples:
  447.  
  448.   static int foobar;
  449.   int auto register foobar;
  450.   string static foobar;
  451.  
  452. * Create declarator aliases by using the keyword `typedef'. Usage:
  453.   "typedef <declarator> <symbol>;". After such a typedef, the alternative
  454.   declarator can be used whereever the original declarator can be used.
  455.  
  456. * Scope of FPL Identifiers
  457.  
  458.   The region where an identifier is visible in a program is referred to
  459.   as the scope of the identifier.
  460.  
  461.   The scope of an identifier is determined by where the identifier is
  462.   declared.
  463.  
  464.   Block scope
  465.   -----------
  466.     The identifier's declaration is located inside a statement
  467.   block.  An identifier with block scope is visible from the point where
  468.   it is declared to the closing brace (}) that ends the block.
  469.  
  470.   You can nest block visibility. A block nested inside a block can
  471.   contain declarations that redeclare identifiers declared in the outer
  472.   block. The new declaration of the identifier applies to the inner
  473.   block. The original declaration is restored when program control
  474.   returns to the outer block. An identifier from the outer block is
  475.   visible inside inner blocks that do not redefine the variable.
  476.  
  477.   File scope
  478.   ----------
  479.     The identifier's declaration appears outside of any block, before the
  480.   start of the program.
  481.   An identifier with file scope is visible from the point where it is
  482.   declared to the end of the source file.
  483.  
  484.   Example:
  485.  
  486.     void cool(int);
  487.     void stupid(int);
  488.  
  489.     int a=-50;
  490.     int b=1000;
  491.     cool(a):
  492.     exit;
  493.  
  494.     void cool(int a)
  495.     {
  496.       stupid(a);
  497.     }
  498.  
  499.     void stupid(int a)
  500.     {
  501.  
  502.                                   - Page 7 -
  503. 8.    Variables
  504.  
  505.       {
  506.         int b=0;
  507.       }
  508.       output(b/a);
  509.     }
  510.  
  511. * All FPL variables must be declared before use and they must be
  512.   declared first in the block. (Blocks are always started with an
  513.   an open brace and ended with return() or a close brace.)
  514.   (NOTE: The technique is like the one used in common C)
  515.   Ex:
  516.  
  517.     int a;
  518.     for(a=0; a<10; a++) {
  519.       int b=0;
  520.       output(b);
  521.     }
  522.  
  523.   is correct, but NOT this:
  524.  
  525.     char a;
  526.     output(a);
  527.     short b=5;  /* the line above broke the chain of declarations */
  528.  
  529. * Variables declared within loop braces will be declared and
  530.   assigned every loop, this is anyhow not good for execution speed! Ex:
  531.  
  532.     int a;
  533.     for(a=0; a<6; a++) {
  534.       int b=a*2;
  535.       output(b, ", ");
  536.     }
  537.  
  538.   This example will output() "0, 2, 4, 6, 8, 10 " !
  539.  
  540. * Multi dimensional variable arrays are supported. To create e.g twenty
  541.   integers:
  542.  
  543.     int hello[20];
  544.  
  545.     (These will be accessible by the names hello[n], where n is a number
  546.     from 0 to 19.)
  547.  
  548.   or
  549.  
  550.     int hello[4][5];
  551.  
  552.     (These will be accessible by the names hello[n][m], where n is a number
  553.     from 0 to 3, and m is a number from 0 to 4.)
  554.  
  555. * Assign arrays using the {} operators. This example assigns var[3] to
  556.   100 and var[4] to 200:
  557.  
  558.     var[3]={100, 200};
  559.  
  560.   When declaring variables, the array assign always begins with the
  561.   first member of the array, this line assigns the four members a[0] to
  562.   a[3]:
  563.  
  564.     string a[4]={"hi", "how", "are", "you?"};
  565.  
  566.   The value of an array assign expression is always the last member of
  567.   the assign list. The following example will output the word "world"
  568.   on the screen:
  569.  
  570.     output(a[0]={"hello", "world"});
  571.  
  572.  
  573.                                   - Page 8 -
  574. 8.    Variables
  575.  
  576.   Compound assigns on arrays are also valid! The following line adds 2,
  577.   3 and 4 to the variables length[3], length[4] and length[5]:
  578.  
  579.     length[3]+={2, 3, 4};
  580.  
  581.   The value of this expression will be the last addition (length[5]+4).
  582.  
  583.   The string append operator is also array friendly. The following
  584.   example add strings to the strings names[1] and names[2].(The
  585.   returning string will be names[2]+=" (stupid)".):
  586.  
  587.     names[1]+={" (ill)", " (stupid)"};
  588.  
  589.   Of course, this works with array using more than one dimension too:
  590.  
  591.     int foo[2][3]={
  592.       {0, 1, 2},
  593.       {2, 3, 4}
  594.     };
  595.  
  596.   On the fly, things like this can (of course) be used:
  597.  
  598.     foo[1]^={{2}, {3, 4}};
  599.  
  600. * Attempts to create a variable with a name that is already being used
  601.   by another variable in the same local level will result in an error.
  602.  
  603. * FPL supports variable referencing, more familiar to C programmers as
  604.   pointers to variables. Currently, though, you cannot declare or assign
  605.   them in any other way than through the parameters of a function call:
  606.  
  607.     int foobar(int *barfoo) /* this function receives an integer reference */
  608.     {
  609.       *barfoo = 5; /* assign the variable 'barfoo' is referencing! */
  610.       barfoo = 5;  /* ILLEGAL /
  611.     }
  612.     int ninja;
  613.     foobar(&ninja); /* make foobar() assign the 'ninja' variable!
  614.  
  615.   The same procedure is indeed possible to perform when referencing strings.
  616.  
  617. 9.    Strings
  618.  
  619. * Strings are always written enclosed within quotation marks (").
  620.  
  621. * To read the ASCII value of a single character within a string, use
  622.   square brackets in the form: name[index] where name is the name of
  623.   the string variable (could of course also be an array member) and
  624.   index is the column you want to check out. Index below zero or above
  625.   the length of the source string will result in error. The following
  626.   example outputs all ASCII codes in a string:
  627.  
  628.      string  str = "hello world";
  629.      int  ascii, n;
  630.      while ( ascii = str[n++] ) {
  631.        output ( ascii "n" );
  632.     }
  633.  
  634.   This example will output all ASCII values in column 2 in the strings
  635.   in the array:
  636.  
  637.      string  str[3] = {"hello", "world", "string"};
  638.      int  n;
  639.      for ( n = 0; n < 3; n++ ) {
  640.        output ( str[n][2] "n" )
  641.     }
  642.  
  643.  
  644.                                   - Page 9 -
  645. 9.    Strings
  646.  
  647.   Reading beyond the end of a string simply returns a zero, while
  648.   reading a negative column will result in an error.
  649.  
  650. * Strings not enclosed within quotes are assumed to be variable names.
  651.  
  652.   Note the difference between:
  653.  
  654.     output("Hello");
  655.  
  656.   and
  657.  
  658.     output(Hello);
  659.  
  660.   (Example 1 outputs the actual string "Hello", while example 2 outputs
  661.   the contents of the variable *named* "Hello".)
  662.  
  663. * Append strings to a string variable by using the '+=' operator. Ex:
  664.  
  665.     string a="Hello ";
  666.     a+="world";
  667.     output(a);
  668.  
  669.   Outputs the string "Hello world" on the screen.
  670.  
  671.     string a = "Hello ";
  672.     string b ="world";
  673.     output( a + b );
  674.  
  675. * Special characters within strings should be symbolized with backslash
  676.   and a character just as in the good old C standard:
  677.   a    - Alert (bell)
  678.   b    - Backspace
  679.   f    - Form feed (new page)
  680.   n    - New-line
  681.   r    - Carriage return
  682.   t    - Horizontal tab
  683.   v    - Vertical tab
  684.   '    - Single quotation mark
  685.   "    - Double quotation mark
  686.   ?    - Question mark
  687.   \    - Backslash
  688.   xhh  - hex number, where "hh" is a two digit hexadecimal value.
  689.   nnn  - octal number, where "nnn" is a three digit octal value.
  690.  
  691. See also the function reference for string handling functions such as
  692.  strcmp(), strncmp(), substr(), eval() and more.
  693.  
  694. 10.    Functions
  695.  
  696. If you are not aquinted to the use/calling of functions from FPL, read the
  697.  general function usage  paragraph.
  698.  
  699. In a standard FPL environment there is a lot of functions that the FPL
  700. programs can use. They are added to FPL in three different ways:
  701.  
  702. * The host program of FPL adds a lot of functions so that the programs really
  703.   can do anything fun with the software. Such functions are called "external"
  704.   functions and they can't be described in this document but will be found in
  705.   the host programs documentation.
  706.  
  707. *  Inside functions  that are declared and defined in an
  708.   FPL program. Any FPL program can create a function that can be called from
  709.   another function and that is treated and looks just like all the other
  710.   functions.
  711.  
  712. * The  Internal functions  are supplied by FPL itself. Such functions
  713.   will always be there, no matter what the name or the purpose of the host
  714.  
  715.                                  - Page 10 -
  716. 10.    Functions
  717.  
  718.   program is.
  719.  
  720. 11.    Declare inside functions
  721.  
  722.  This chapter handles FPL function declarations and definitions. A function
  723. declararation declares the format and existence of a function prior to its
  724. use. A function definition defines a function.
  725.  
  726.  A function in FPL must always be declared (prototyped) or defined before it
  727. is used. Otherwise it doesn't know where to find the function and how to
  728. interpret its parameters.
  729.  
  730.     Function Declaration (prototyping)
  731.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  732.  A function declaration establishes the name of the function, the type of
  733. result that the function returns and the types of the arguments expected by
  734. the function when you call it.
  735.  
  736. If the function does not return a value, declare it as a function returning
  737. void.
  738.  
  739. If the function is to be accessed from other program than this, it should be
  740. declared `export <the rest>'.
  741.  
  742. Example:
  743.  
  744.       int func (int, string);
  745.  
  746.     Function Definition
  747.     ~~~~~~~~~~~~~~~~~~~
  748.  A function definition specifies the name, formal parameters, and body of a
  749. function. You must also specify the function's return type.
  750.  
  751. A function definition contains the following:
  752.  
  753. * A type specifier, which determines the type of value that
  754.   the function returns. A function returning no value should be declared
  755.   to return `void'. A function can have any type specifier.
  756.  
  757. * A function identifier, which provides the function with a name.
  758.  
  759. * A list of parameters that the function expects and their types.
  760.  
  761. * A block statement, which contains data definitions and code.
  762.  
  763.  A function can be called by itself or by any function that appears in the
  764. same file as the function definition. If a function has been declared
  765. `export'ed, the function also can be called by functions that appear in other
  766. files, otherwise it can only be directly invoked from within the same source
  767. file.
  768.  
  769.  The function definition or a declaration for the function must appear before,
  770. and in the same file as, a call to the function.  All declarations for a given
  771. function must be compatible with the function definition. They must have the
  772. same return type and the same parameter types.
  773.  
  774.  The following example is a complete definition of the function sum:
  775.  
  776.       int sum(int x,int y)
  777.       {
  778.         return(x + y);
  779.       }
  780.  
  781.  The function sum returns int, and receives two values declared as x and y.
  782. The function body contains a single statement that returns the sum of x and
  783. y.
  784.  
  785.  
  786.                                  - Page 11 -
  787. 11.    Declare inside functions
  788.  
  789.  To indicate that a function accepts no parameters, use the keyword void as
  790. the type specifier in place of the parameter.  For example:
  791.  
  792.       stop(void) { }
  793.  
  794.  In the following example, the function f() takes one integer parameter and
  795. returns no value, while g() expects no parameters and returns an integer.
  796.  
  797.       void f(int); int g(void);
  798.  
  799.     Function Body
  800.     ~~~~~~~~~~~~~
  801.  The body of a function is a  block statement.  The following function has an
  802. empty body:
  803.  
  804.      void stub1(void) { }
  805.  
  806. The body of the following function contains a definition for the integer
  807. variable big_num and a call to the function  printf:
  808.  
  809.       void largest(int num1, int num2) {
  810.          int big_num;
  811.       
  812.          if (num1 >= num2)
  813.            big_num = num1;
  814.          else
  815.            big_num = num2;
  816.       
  817.          printf("big_num = %d\n", big_num);
  818.          return 0;
  819.       }
  820.  
  821. Block statements are described in  Statements .
  822.  
  823. * Prototypes *MUST* be first in the program. Before any program starts and
  824.   outside all braces to be global. Prototyping within the braces of a
  825. function
  826.   makes the function only local accessible.
  827.  
  828. 12.    General function use
  829.  
  830.  Here follows the ground rules when using/calling a function in FPL programs.
  831.  
  832. * A function call has three major parts:
  833.   1 - The function identifier. The name of the function.
  834.   2 - A list of parameters. Most functions demands some kind of input.
  835.   3 - A return code from the function call.
  836.  
  837.   In the example:
  838.  
  839.                         retval = foobar ( "hello", 100 ) ;
  840.  
  841.   Reference letter:        A        B   C    D   E   F G H
  842.  
  843.   A - The variable that received the return code of the function. It must be
  844.       be of the type that the function returns. If the function returns a
  845.       string, the variable that receives the return code must be a string.
  846.       A return code from a function can always be ignored. Often it is wise
  847.       to check for progress, but it is always the choice of the programmer.
  848.  
  849.   B - The function name. We call the "foobar" function in this example.
  850.  
  851.   C - Always write the parameter list within parentheses. They tell FPL that
  852.       this really is a function. Even functions without in any input
  853.       parameters must be called with parentheses (but then without any
  854.       parameters in between)!
  855.  
  856.  
  857.                                  - Page 12 -
  858. 12.    General function use
  859.  
  860.   D - This is the first parameter to the function. Appearantly this function
  861.       accepts a string type as first parameter. Any string variable or string
  862.       expression is then a valid parameter.
  863.  
  864.   E - Separate all parameters with a comma ",".
  865.  
  866.   F - This is a second parameter. Appearantly this function accepts an
  867.       integer type as second parameter. Any integer variable or numerical
  868.       expression is then a valid parameter.
  869.  
  870.   G - Conclude the parameter list with a closing parenthesis. Obviously, this
  871.       function is happy with two parameters.
  872.  
  873.   H - End of statement is as always indicated with a semicolon ";".
  874.  
  875.  
  876. * Internal and external functions might have some arguments optional and some
  877.   functions may even accept parameter lists (an optional amount of parameters
  878.   of a certain type). All functions must always at least be called with the
  879.   number of required arguments as declared. Refer to the software docs.
  880.  
  881.  
  882. * There are four kinds of arguments possible to pass to a function :
  883.  
  884.   1. Strings - constant strings or expressions returning strings.
  885.  
  886.   2. Numeric arguments - are likewise read as  numerical expressions 
  887.      including everything true expressions consist of. An integer argument
  888.      can be sent as any kind of "char", "int" or "short" and can be received
  889.      by any one of those. FPL is tolerant when speaking about the mix of
  890.      such.
  891.  
  892.   3. String variable references - pointer to a  string variable .
  893.  
  894.   4. Numeric variable references - pointer to an  integer variable .
  895.      Just as with integer arguments, the use of the integers can be any of
  896.      the three integer types "char", "short" and "int"/"long".
  897.  
  898.  
  899. * All arguments that should be sent to and received in the function must
  900.   be declared by comma separating "int", "string", "int *" or "string *".
  901.   (Using "char", "short" or "long" is of course working too.)
  902.  
  903.     "int"       - sends an integer result of an expression.
  904.     "string"    - sends a string result.
  905.     "int *"     - sends a named integer variable.
  906.     "string *"  - sends a named string variable.
  907.  
  908.   Sending "int *" or "string *" makes the function able to change the
  909.   contents of the variables used in the calling function.
  910.  
  911.   All declared arguments are required. Optionals are not possible to declare.
  912.  
  913.   C programmers see the obvious inspiration programming language.
  914.  
  915. 13.    Constants
  916.  
  917.   Sepcifying constants in FPL can be done in several ways.
  918.  
  919.   Numeric expression constants can be written as:
  920.  
  921.   WHAT                  HOW                             EXAMPLE
  922.   ------------------------------------------------------------------
  923.  
  924.   * octal number        an octal number with a zero     012
  925.                         prefix
  926.  
  927.  
  928.                                  - Page 13 -
  929. 13.    Constants
  930.  
  931.   * binary number       a binary number with a "0b"     0b011010
  932.                         prefix
  933.  
  934.   * hexadecimal number  a hexadecimal number with a     0xDEADBEEF
  935.                         "0x" prefix
  936.  
  937.   * decimal number      a number                        129
  938.  
  939.   * ASCII code          a character within apostrophes  'a'
  940.  
  941.  
  942.   String constants can also be written as:
  943.  
  944.   * octal numbers       "\nnn" where nnn is an 1-3      "\12"
  945.                         digit octal number
  946.  
  947.   * hexadecimal numbers "\xhh" where hh is a two digit  "\xea"
  948.                         hexdecimal number
  949.  
  950.   * a string            anything within quots           "k i ll^e(rn/injax"
  951.  
  952. 14.    Blockstatement
  953.  
  954.   A block statement lets you to group any number of data definitions,
  955. declarations, and statements into one statement.  All definitions,
  956. declarations, and statements enclosed within a single set of braces are
  957. treated as a single statement.  You can place a block wherever a single
  958. statement is allowed.
  959.  
  960.   All definitions and declarations occur at the beginning of a block before
  961. statements.  Statements must follow the definitions and declarations.  A block
  962. is treated as a single statement.
  963.  
  964.   If you redefine a data object inside a nested block, the inner object hides
  965. the outer object while the inner block is processed.  Defining several
  966. variables that have the same identifier can make a program difficult to
  967. understand and maintain.  Therefore, you should limit such redefinitions of
  968. identifiers within nested blocks.
  969.  
  970.   If a data object is usable within a block and its identifier is not
  971. redefined, all nested blocks can use that data object.
  972.  
  973.   Initialization of an auto or register variable occurs each time the block is
  974. run from the beginning.  If you transfer control from one block to the middle
  975. of another block, initializations are not always performed.  You cannot
  976. initialize an extern variable within a block.
  977.  
  978.   Examples
  979.  
  980. The following example shows how the values of data objects change in nested
  981. blocks:
  982.  
  983.   int main(void)
  984.   {
  985.      int x = 1;               /* Initialize x to 1 */
  986.      int y = 3;
  987.  
  988.      if (y > 0)
  989.      {
  990.        int x = 2;           /* Initialize x to 2 */
  991.        output("second x = ", x, "\n");
  992.      }
  993.      output("first x = ", x, "\n");
  994.   }
  995.  
  996. The example produces the following output:
  997.  
  998.  
  999.                                  - Page 14 -
  1000. 14.    Blockstatement
  1001.  
  1002.   second x = 2
  1003.   first x = 1
  1004.  
  1005.   Two variables named x are defined in main.  The definition of x on line 5
  1006. retains storage throughout the execution of main.  However, because the
  1007. definition of x on line 10 occurs within a nested block, line 11 recognizes x
  1008. as the variable defined on line 10.  Line 13 is not part of the nested block.
  1009. Thus, line 13 recognizes x as the variable defined on line 5.
  1010.  
  1011. 15.    Statements
  1012.  
  1013.   These are the statements that FPL includes:
  1014.  
  1015.         -  Block      
  1016.         -  break      
  1017.         -  continue   
  1018.         -  do         
  1019.         -  Expression 
  1020.         -  for        
  1021.         -  if         
  1022.         -  Null       
  1023.         -  return     
  1024.         -  switch      (New from version 7)
  1025.         -  while      
  1026.  
  1027. 16.    Null statement
  1028.  
  1029.   The null statement performs no operation;
  1030.  
  1031. SYNTAX
  1032.         ;
  1033.  
  1034. EXAMPLE
  1035.         int i;
  1036.         for(i=0; i<100; function(i++))
  1037.           ; /* null statement */
  1038.  
  1039. 17.    Expression statement
  1040.  
  1041.   Expression statements performs some kind of evaluation of expression(s).
  1042.  
  1043. * Statements must feature an action or cause an error.
  1044.  
  1045.   int a;        /***************************************/
  1046.   a++;          /* These are examples of statements    */
  1047.   a=2;          /* that include some kind of "action". */
  1048.   go(a);        /***************************************/
  1049.  
  1050.   2+2;          /************************************************/
  1051.   a;            /* These lines are NOT valid stand aloners      */
  1052.   (c>22)*3;     /* since they don't perform any kind of change. */
  1053.   a-14*a;       /************************************************/
  1054.  
  1055.  
  1056.   Since the release of version 10, FPL does now feature yet another ANSI C
  1057. feature:
  1058.  
  1059.   Expressions containing the operators &&, || or ?: can be only partly
  1060. evaluated depending on the results of the other parts. Ex, in the expression
  1061. "(a || b)" a is true, and then FPL won't execute/evaluate b. Likewise "(a &&
  1062. b)" where a is FALSE, will never reach b. Also "a=b?c:d" will reach c only if
  1063. b is true, and d only if b is false!!
  1064.  
  1065. 18.    Keywords
  1066.  
  1067. Detailed information is obtained in the  keyword reference .
  1068.  
  1069.  
  1070.                                  - Page 15 -
  1071. 18.    Keywords
  1072.  
  1073.     Summary:
  1074.     ========
  1075.  
  1076. * Loop statements are done very similarly as in C, using the 'for', 'while'
  1077.   or 'do' statements. They are used as in the C programming language:
  1078.   (with exception for the wonderful "else" statement in "while"... )
  1079.  
  1080.      do  {  statement ;}  while (  expression  )
  1081.  
  1082.      while  (  expression  ) {  statement ; } [  else  {  statement : } ]
  1083.  
  1084.      for  ( expression1 ;  expression2 ;  expression3 ) {  statement ; }
  1085.  
  1086.   A feature (which I've always been missing when coding C) has been
  1087.   added, and that's `else' after `while'! If the condition never goes
  1088.   true, the 'else' statement will be executed.
  1089.  
  1090.    continue  works 100% as in C.
  1091.  
  1092.    break  is like break in C, but extended with an optional level
  1093.   argument.
  1094.  
  1095. * Take care of exceptions just as you do in C using statements like:
  1096.  
  1097.    if  (  expression  ) {  statement ; } [  else  {  statement ; } ]
  1098.  
  1099. * Declare variables and functions by using the keywords:
  1100.  
  1101.    int ,  char ,  short  and  long  that all creates numerical variables.
  1102.  
  1103.    string  declares a string variable.
  1104.  
  1105.    resize  changes the size of an already existing array.
  1106.  
  1107.    export  tells FPL that the following global declaration
  1108.   is to be exported. Exported global symbols are accessible in any file.
  1109.  
  1110.    More variable declaration details .
  1111.  
  1112. * Exit programs or functions by using:
  1113.  
  1114.    exit  or  return 
  1115.  
  1116. 19.    Hints and tricks
  1117.  
  1118.   Since I've created FPL and know about its inner workings, I'll try to sum a
  1119. few words about what could be useful to think of when coding FPL.
  1120.  
  1121.     General
  1122.     =======
  1123.  
  1124.  Parenthesized expressions will help you from making mistakes in expressions
  1125. due to lack of operator precedence knowledge.
  1126.  
  1127.  Do not declare unnecessary variables or variables you don't have to use. Try
  1128. to reuse already declared ones and stay away from the nasty variable
  1129. declaration  keywords !
  1130.  
  1131.  Of course FPL is a perfect example of using a C programming preprocessor if
  1132. you want preprocessor features like include files, macros and such goodies.
  1133. FPL currently works perfect running preprocessed programs including the
  1134. preprocessor instruction "#line".
  1135.  
  1136.     Interpreting speed
  1137.     ==================
  1138.  
  1139.  FPL Performance philosophy is a structured programmer's nightmare coming
  1140.  
  1141.                                  - Page 16 -
  1142. 19.    Hints and tricks
  1143.  
  1144. true. What is said to be ugly or even dirty coding in C, in fact often is to
  1145. prefer in FPL since it's interpreting one statement at a time.
  1146.  
  1147.  Do as much as you can in as few  statements  as possible is a golden rule.
  1148. Use as few function calls as possible. Try to append everything possible to
  1149. the function's argument and call it only once.
  1150.  
  1151.  Use  compound  and nested  variable assigns ! FPL has no compiler, which
  1152. makes statements like "a=a+2; b=b+a; function(a);" interpret MUCH slower than
  1153. "function(b+=(a+=2))" even though it might look better and be more readable.
  1154. (If it was hard to code it should be hard to read, right?)
  1155.  
  1156.  Avoid long and complicated  string handlings . If you must use a string, try
  1157. putting it in a variable and refer to that variable as much as possible.
  1158. Especially loops will benefit a *LOT* in speed. Future version of FPL might
  1159. deal with static strings (non-variable referenced) in a better way.
  1160.  
  1161.     Bug hunting
  1162.     ===========
  1163.  
  1164.   Of course even FPL routines will be coded incorrect from time to time.
  1165.  
  1166.  Comment your code. It's not hard, decreases performance only slightly and
  1167. makes it so very much easier to change the code. And who knows, perhaps
  1168. someone else would want to change it in the future!
  1169.  
  1170.  Wait for the soon appearing FPL debugger!
  1171.  
  1172. 20.    Numeric expressions (and operators)
  1173.  
  1174.   Numeric expressions are a basic part of FPL programs. Expressions are
  1175. evaluated on the basis of the operators that the expressions contain and the
  1176. contexts where the expressions can be used.
  1177.  
  1178.      Constants                Not changing values
  1179.     
  1180.      Grouping and evaluating  Precedence, associativity, etc
  1181.     
  1182.      Primary Expressions      Parentheses, function calls
  1183.      Unary Expressions        ++, --, +, -, !, ~
  1184.      Binary Expressions       (*, /, %, +, -, <<, >>, <, >, <=, >=, ==, etc)
  1185.      Assignment expressions   (+=, -=, *=, /=, %=, etc)
  1186.      Conditional Expressions  (?, :)
  1187.      Comma expressions        (,)
  1188.  
  1189. 21.    Grouping and evaluating
  1190.  
  1191.  Two operator characteristics determine how operands group with operators:
  1192. precedence and associativity. Precedence provides a priority system for
  1193. grouping different types of operators with their operands. Associativity
  1194. provides a left-to-right order for grouping operands to operators that have
  1195. the same precedence.
  1196.  
  1197.  You can explicitly state the grouping of operands with operators by using
  1198. parentheses.
  1199.  
  1200.  In the expression
  1201.  
  1202.  a + b * c / d
  1203.  
  1204.  the * and / operations are evaluated before + because of precedence. b is
  1205. multiplied by c before it is divided by d because of associativity.
  1206.  
  1207.  The following table lists the FPL language operators in their order of
  1208. precedence. The operators are listed in order of precedence:  primary 
  1209. operators have the highest precedence, and the  comma operator  has the lowest
  1210. precedence. Operators that appear in the same group have the same precedence.
  1211.  
  1212.                                  - Page 17 -
  1213. 21.    Grouping and evaluating
  1214.  
  1215.  
  1216.  FPL's operator precedence is 100% ANSI C compatible.
  1217.  
  1218.     Operator Precedence and Associativity (decreasing order):
  1219.     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1220.  
  1221.     Operator Type           Associativity   Operators
  1222.     -------------           -------------   ---------
  1223.      Primary               left to right   (), function calls
  1224.      Unary                 right to left   ++ -- - + ! ~ []
  1225.      Multiplicative        left to right   * / %
  1226.      Additive              left to right   + -
  1227.      Bitwise Shift         left to right   << >>
  1228.      Relational            left to right   < > <= >=
  1229.      Equality              left to right   == !=
  1230.      Bitwise Logical AND   left to right   &
  1231.      Bitwise Exclusive OR  left to right   ^
  1232.      Bitwise Inclusive OR  left to right   |
  1233.      Logical AND           left to right   &&
  1234.      Logical OR            left to right   ||
  1235.      Conditional           right to left   ? :
  1236.      Assignment            right to left   = += -= *= /= <<= &= ^= |= >>=
  1237.      Comma                 left to right   ,
  1238.  
  1239.  
  1240.  The order of evaluation for the operands of the logical AND (&&) and the
  1241. logical OR (||) operators is always left-to-right. If the operand on the left
  1242. side of a && operator evaluates to 0 (zero), the operator on the right side is
  1243. not evaluated. If the operand on the left side of a || operator evaluates to
  1244. nonzero, the operator on the right side is not evaluated.
  1245.  
  1246.  
  1247.     Examples
  1248.  
  1249. The parentheses in the following expressions explicitly show how FPL groups
  1250. operands and operators:
  1251.  
  1252.     total = (4 + (5 * 3));
  1253.     total = (((8 * 5) / 10) / 3);
  1254.     total = (10 + (5/3));
  1255.  
  1256.  FPL group operands with operators that are both associative and commutative
  1257. in a simple left-to-right order. We group the operands and operators of the
  1258. expression
  1259.  
  1260.     total = price + prov_tax + city_tax;
  1261.  
  1262. in the following way (as indicated by parentheses):
  1263.  
  1264.     total = ((price + prov_tax) + city_tax);
  1265.  
  1266.  TECH NOTE:
  1267.  ~~~~~~~~~~
  1268.  In C, the example above could have been evaluated the following ways too
  1269.     total = ((price + city_tax) + prov_tax);
  1270.     total = (price + (prov_tax + city_tax));
  1271.  
  1272.  But that's not too good if you want to use expressions like
  1273.     a = b++ + (b>10?10:20);
  1274.  since you wouldn't know in which order the b variable is read and used... FPL
  1275. reads and uses it in a left-to-right order.
  1276.  
  1277. 22.    Primary expressions
  1278.  
  1279.  All primary operators have the same precedence and have left-to-right
  1280. associativity. See  Grouping and Evaluating FPL Expressions 
  1281.  
  1282.  
  1283.                                  - Page 18 -
  1284. 22.    Primary expressions
  1285.  
  1286.  For detailed information on primary operators, see
  1287.  
  1288.      Parenthesized Expressions 
  1289.      Function calls 
  1290.  
  1291. 23.    Parenthesized Expressions
  1292.  
  1293.  You can use parentheses to explicitly state how operands group with
  1294. operators. The following expression does not contain any parentheses used for
  1295. grouping operands and operators. The parentheses surrounding weight and
  1296. zipcode form a function call. Notice how FPL groups the operands and operators
  1297. in this expression:
  1298.  
  1299.  Expression without Parentheses:
  1300.  
  1301.        -discount * item + handling(weight, zipcode) > 10 * item
  1302.  
  1303.  The following expression is similar, but contains parentheses that change how
  1304. the operands and operators are grouped:
  1305.  
  1306.  Expression with Parentheses:
  1307.  
  1308.       (-discount * (item + handling(weight, zipcode))) > (10 * item)
  1309.  
  1310. 24.    Function calls
  1311.  
  1312.  A function call is a primary expression followed by a parenthesized argument
  1313. list. The argument list can contain any number of expressions separated by
  1314. commas, or it can be empty.
  1315.  
  1316.  For example:
  1317.  
  1318.       stub()
  1319.  
  1320.       overdue(account, date, amount)
  1321.  
  1322.       notify(name, (date+5))
  1323.  
  1324.       report(error, time, date, (num++))
  1325.  
  1326.  The arguments are evaluated, and each parameter is assigned the value of the
  1327. corresponding argument. Assigning a value to a parameter changes the value
  1328. with in the function, but has no effect on the argument.
  1329.  
  1330. 25.    Unary Expression
  1331.  
  1332.  
  1333.  An unary expression contains one operand of scalar type and an unary
  1334. operator. All unary operators have the same  precedence . As indicated in the
  1335. following descriptions, the usual arithmetic conversions are performed on the
  1336. operands of most unary expressions.
  1337.  
  1338.       Bitwise Negation ~ 
  1339.       Decrement --       
  1340.       Increment ++       
  1341.       Logical Negation ! 
  1342.       Unary Minus -      
  1343.       Unary Plus +       
  1344.  
  1345. 26.    Increment ++
  1346.  
  1347.  The ++ (increment) operator adds 1 (one) to the value of the operand. The
  1348. operand receives the result of the increment operation.
  1349.  
  1350.  You can place the ++ before or after the operand. If the ++ appears before
  1351. the operand, the operand is incremented; then the incremented value is used in
  1352. the expression. If you place the ++ after the operand, the current value of
  1353.  
  1354.                                  - Page 19 -
  1355. 26.    Increment ++
  1356.  
  1357. the operand is used in the expression; then the operand is incremented. For
  1358. example:
  1359.  
  1360.       play = ++play1 + play2++;
  1361.  
  1362.  is equivalent to the following sequence of expressions:
  1363.  
  1364.       play1 = play1 + 1;
  1365.       play = play1 + play2;
  1366.       play2 = play2 + 1;
  1367.  
  1368.  In the C language they say "avoid using a variable more than once in an
  1369. expression where the variable is incremented". But that's not necessary in
  1370. FPL! I've created it to work as I wanted it, and so it does...
  1371.  
  1372.       y = x(i) + i++;
  1373.  
  1374. Does work exactly as you think; first calls the function x(), adds the value
  1375. of i and finally increases i.
  1376.  
  1377. 27.    Decrement --
  1378.  
  1379. Acts as the  ++ operator , but instead of adding it's subtracting!
  1380.  
  1381. 28.    Unary plus +
  1382.  
  1383. The + (unary plus) operator maintains the value of the operand.
  1384.  
  1385. The result of applying the unary plus operator to a signed operand is
  1386. equivalent to the promoted type of the operand.
  1387.  
  1388. 29.    Unary minus -
  1389.  
  1390. The - (unary minus) operator negates the value of the operand.
  1391.  
  1392. The result of applying the unary minus operator to a signed operand is
  1393. equivalent to the negative promoted type of the operand.
  1394.  
  1395. For example, if quality has the value 100, then -quality has the value -100.
  1396.  
  1397. 30.    Logical negation !
  1398.  
  1399. The ! (logical negation) operator determines whether the operand evaluates to
  1400. 0 (false). If so, the operation yields the value 1 (true). If the expression
  1401. evaluates to a nonzero value, the operation yields the value 0 (false).
  1402.  
  1403. If right is not equal to 0, the following two expressions are equivalent:
  1404.  
  1405.   !right;
  1406.   right == 0;
  1407.  
  1408. 31.    Bitwise negation ~
  1409.  
  1410. The ~ (bitwise negation) operator yields the ones complement of the operand.
  1411. In the binary representation of the result, every bit has the opposite value
  1412. of the same bit in the operand. 
  1413.  
  1414. Suppose x represents the decimal value 5. The 32-bit binary representation of
  1415. x is:
  1416.  
  1417. 00000000000000000000000000000101
  1418.  
  1419. The expression ~x yields the following result, represented here as a 32-bit
  1420. binary number:
  1421.  
  1422. 11111111111111111111111111111010
  1423.  
  1424.  
  1425.                                  - Page 20 -
  1426. 31.    Bitwise negation ~
  1427.  
  1428. The 32-bit binary representation of ~0 is:
  1429.  
  1430. 11111111111111111111111111111111
  1431.  
  1432. 32.    Binary expressions
  1433.  
  1434.  A binary expression contains two operands separated by one operator.
  1435.  
  1436.  Not all binary operators have the same  precedence .
  1437.  
  1438.  To ensure correct results, avoid creating expressions that depend on the
  1439. order in which FPL evaluates the operands.
  1440.  
  1441.      Addition +             
  1442.      Bitwise AND &          
  1443.      Bitwise Exclusive OR ^ 
  1444.      Bitwise Inclusive OR | 
  1445.      Bitwise Shift << >>    
  1446.      Division /             
  1447.      Equality == !=         
  1448.      Logical AND &&         
  1449.      Logical OR ||          
  1450.      Multiplication *       
  1451.      Relational < > <= >=   
  1452.      Remainder %            
  1453.      Subtraction -          
  1454.  
  1455. 33.    Multiplication *
  1456.  
  1457. The * (multiplication) operator yields the product of its operands.
  1458.  
  1459. Because multiplication has both associative and commutative properties, the
  1460. operands will be grouped in a left-to-right order. For example, the
  1461. expression:
  1462.  
  1463.   sites * number * cost
  1464.  
  1465. is interpreted in  the following way:
  1466.  
  1467.   (sites * number) * cost
  1468.  
  1469. 34.    Division /
  1470.  
  1471. The / (division) operator yields the quotient of its operands.
  1472.  
  1473. If both operands are positive integers and the operation produces a remainder,
  1474. FPL ignores the remainder. Thus, the expression 7 / 4 yields the value 1
  1475. (rather than 1.75 or 2).
  1476.  
  1477. The C language does not define how the compiler treats the quotient when
  1478. either of the operands has a negative value.  Thus, -7 / 4 can yield either -1
  1479. or -2. However, on all IBM C compilers, -7 / 4 always results in a quotient of
  1480. -1 and a  remainder  of -3, and that's the rule FPL has been following.
  1481.  
  1482. It ends up in an error message if the second operand (the denominator)
  1483. evaluates to 0 (zero).
  1484.  
  1485. 35.    Remainder %
  1486.  
  1487. The % (remainder) operator yields the remainder from the  division  of the
  1488. left operand by the right operand. For example, the expression 5 % 3 yields
  1489. 2.
  1490.  
  1491. If the right operand evaluates to 0 (zero), it results in an error message. If
  1492. either operand has a negative value, the result is such that the following
  1493. expression always yields the value of a if b is not 0 (zero):
  1494.  
  1495.  
  1496.                                  - Page 21 -
  1497. 35.    Remainder %
  1498.  
  1499.   ( a / b ) * b + a % b;
  1500.  
  1501. 36.    Addition +
  1502.  
  1503. The + (addition) operator yields the sum of its operands.
  1504.  
  1505. 37.    Subtraction -
  1506.  
  1507. The - (subtraction) operator yields the difference of its operands.
  1508.  
  1509. 38.    Bitwise left and right shift << >>
  1510.  
  1511. The bitwise shift operators move the bit values of a binary object. The left
  1512. operand specifies the value to be shifted. The right operand specifies the
  1513. number of positions that the bits in the value are to be shifted.
  1514.  
  1515. The << (bitwise left shift) operator indicates the bits are to be shifted to
  1516. the left. The >> (bitwise right shift) operator indicates the bits are to be
  1517. shifted to the right.
  1518.  
  1519. The right operand should not have a negative value or a value that is greater
  1520. than the width in bits of the expression being shifted. Bitwise shifts on such
  1521. values give unpredictable results.
  1522.  
  1523. If the right operand has the value 0 (zero), the result is the value of the
  1524. left operand (after the usual arithmetic conversions).
  1525.  
  1526. The << operator fills vacated bits with zeros. For example, if l_op has the
  1527. value 4019, the bit pattern (in 32-bit format) of l_op is:
  1528.  
  1529. 00000000000000000000111110110011
  1530.  
  1531. The expression l_op << 3 yields:
  1532.  
  1533. 00000000000000000111110110011000
  1534.  
  1535. The result is the integral part of the quotient of the left operand divided by
  1536. the quantity, 2 raised to the power of the right operand. If the left operand
  1537. has a negative value, the vacated bits of a signed value are filled with a
  1538. copy of the sign bit of the unshifted value. For example, if l_op has the
  1539. value -25, the bit pattern (in 32-bit format) of l_op is:
  1540.  
  1541. 11111111111111111111111111100111
  1542.  
  1543. Vacated bits are filled with ones, and the expression l_op >> 3 yields:
  1544.  
  1545. 11111111111111111111111111111100
  1546.  
  1547. 39.    Relational < > <= >=
  1548.  
  1549. The relational operators compare two operands for the validity of a
  1550. relationship. If the relationship stated by the operator is true, the value of
  1551. the result is 1 (one). Otherwise, the value of the result is 0 (zero).
  1552.  
  1553. FPL has the following relational operators:
  1554.  
  1555. Operator        Usage
  1556.  
  1557. <       Indicates whether the value of the left operand is less than
  1558.         the value of the right operand.
  1559.  
  1560. >       Indicates whether the value of the left operand is greater than
  1561.         the value of the right operand.
  1562.  
  1563. <=      Indicates whether the value of the left operand is less than or
  1564.         equal to the value of the right operand.
  1565.  
  1566.  
  1567.                                  - Page 22 -
  1568. 39.    Relational < > <= >=
  1569.  
  1570. >=      Indicates whether the value of the left operand is greater than
  1571.         or equal to the value of the right operand.
  1572.  
  1573. Relational operators have also left-to-right associativity. Therefore, the
  1574. expression:
  1575.  
  1576.   a < b <= c
  1577.  
  1578. is interpreted as:
  1579.  
  1580.   (a < b) <= c
  1581.  
  1582. If the value of a is less than the value of b, the first relationship is true
  1583. and yields the value 1 (one).  The value 1 (one) is then compared with the
  1584. value of c.
  1585.  
  1586. 40.    Equality == !=
  1587.  
  1588. The equality operators, like the relational operators, compare two operands
  1589. for the validity of a relationship. The equality operators, however, have a
  1590. lower precedence than the relational operators. If the relationship stated by
  1591. an equality operator is true, the value of the result is 1 (one). Otherwise,
  1592. the value of the result is 0 (zero).
  1593.  
  1594. FPL has the following equality operators:
  1595.  
  1596. Operator        Usage
  1597.  
  1598. ==      Indicates whether the value of the left operand is equal to the
  1599.         value of the right operand.
  1600.  
  1601. !=      Indicates whether the value of the left operand is not equal to
  1602.         the value of the right operand.
  1603.  
  1604. The following expressions contain examples of equality and relational
  1605. operators:
  1606.  
  1607.   time < max_time == status < complete
  1608.   hello != world
  1609.  
  1610. 41.    Bitwise AND &
  1611.  
  1612. The & (bitwise AND) operator compares each bit of its first operand to the
  1613. corresponding bit of the second operand. If both bits are 1's, the
  1614. corresponding bit of the result is set to 1. Otherwise, it sets the
  1615. corresponding result bit to 0.
  1616.  
  1617. The following example shows the values of a, b, and the result of a & b
  1618. represented as 32-bit binary numbers:
  1619.  
  1620. bit pattern of a        00000000000000000000000001011100
  1621.  
  1622. bit pattern of b        00000000000000000000000000101110
  1623.  
  1624. bit pattern of a & b    00000000000000000000000000001100
  1625.  
  1626. 42.    Bitwise Exclusive OR ^
  1627.  
  1628. The ^ (bitwise exclusive OR) operator compares each bit of its first operand
  1629. to the corresponding bit of the second operand. If both bits are 1's or both
  1630. bits are 0's, the corresponding bit of the result is set to 0. Otherwise, this
  1631. operator sets the corresponding result bit to 1.
  1632.  
  1633. The following example shows the values of a, b, and the result of a ^ b
  1634. represented as 32-bit binary numbers:
  1635.  
  1636. bit pattern of a        00000000000000000000000001011100
  1637.  
  1638.                                  - Page 23 -
  1639. 42.    Bitwise Exclusive OR ^
  1640.  
  1641.  
  1642. bit pattern of b        00000000000000000000000000101110
  1643.  
  1644. bit pattern of a^b      00000000000000000000000001110010
  1645.  
  1646. 43.    Bitwise inclusive OR |
  1647.  
  1648. The | (bitwise inclusive OR) operator compares the values (in binary format)
  1649. of each operand and yields a value whose bit pattern shows which bits in
  1650. either of the operands has the value 1 (one). If both of the bits are 0
  1651. (zero), the result of the comparison is 0 (zero); otherwise, the result is 1
  1652. (one).
  1653.  
  1654. The following example shows the values of a, b, and the result of a | b
  1655. represented as 32-bit binary numbers:
  1656.  
  1657. bit pattern of a        00000000000000000000000001011100
  1658.  
  1659. bit pattern of b        00000000000000000000000000101110
  1660.  
  1661. bit pattern of a | b    00000000000000000000000001111110
  1662.  
  1663. 44.    Logical AND &&
  1664.  
  1665.  The && (logical AND) operator indicates whether both operands have a nonzero
  1666. value. If both operands have nonzero values, the result has the value 1 (one).
  1667. Otherwise, the result has the value 0 (zero).
  1668.  
  1669.  The following examples show how the language evaluates expressions that
  1670. contain the logical AND operator:
  1671.  
  1672.  Expression      Result
  1673.  ~~~~~~~~~~      ~~~~~~
  1674.  1 && 0          0
  1675.  
  1676.  1 && 4          1
  1677.  
  1678.  0 && 0          0
  1679.  
  1680.  
  1681.  Expressions like "a && b" will only evaluate b if a is false!
  1682.  
  1683.  
  1684. NOTE: The logical AND (&&) should not be confused with the bitwise AND (&)
  1685. operator.  For example,
  1686.  
  1687.   1 && 4 evaluates to 1
  1688.  
  1689. while
  1690.  
  1691.   1 & 4 evaluates to 0
  1692.  
  1693. 45.    Logical OR ||
  1694.  
  1695.  The || (logical OR) operator indicates whether either operand has a nonzero
  1696. value. If either operand has a nonzero value, the result has the value 1
  1697. (one). Otherwise, the result has the value 0 (zero).
  1698.  
  1699.  The following examples show how expressions that contain the logical OR
  1700. operator are evaluated:
  1701.  
  1702.  Expression      Result
  1703.  ~~~~~~~~~~      ~~~~~~
  1704.  1 || 0          1
  1705.  
  1706.  1 || 4          1
  1707.  
  1708.  
  1709.                                  - Page 24 -
  1710. 45.    Logical OR ||
  1711.  
  1712.  0 || 0          0
  1713.  
  1714.  
  1715. Expressions like "a || b" will only reach b if a is false.
  1716.  
  1717.  
  1718. NOTE: The logical OR (||) should not be confused with the bitwise OR (|)
  1719. operator. For example,
  1720.  
  1721.   1 || 4 evaluates to 1
  1722.  
  1723. while
  1724.  
  1725.   1 | 4 evaluates to 5
  1726.  
  1727. 46.    Conditional expressions
  1728.  
  1729.  
  1730.  (operand1?operand2:operand3)
  1731.  
  1732.  A conditional expression is a compound expression that contains a condition
  1733. (operand1), an expression to be evaluated if the condition has a nonzero value
  1734. (operand2), and an expression to be evaluated if the condition has the value 0
  1735. (zero) (operand3).
  1736.  
  1737.  The conditional expression contains one two-part operator. The ? symbol
  1738. follows the condition, and the : symbol appears between the two action
  1739. expressions. All expressions between the operators ? and : are treated as one
  1740. expression.
  1741.  
  1742.     Examples
  1743.     ~~~~~~~~
  1744.  The following expression determines which variable has the greater value, y
  1745. or z, and assigns the greater value to the variable x:
  1746.  
  1747.       x = (y > z) ? y : z;
  1748.  
  1749.  The following is an equivalent expression:
  1750.  
  1751.       if (y > z) {
  1752.         x = y;
  1753.       } else {
  1754.         x = z;
  1755.       }
  1756.  
  1757.  The following expression assigns an integer. If the variable c is less than
  1758. zero, output receives the value of c. If not, output receives the return code
  1759. from the search function.
  1760.  
  1761.       c = c<0?c:search("hello");
  1762.  
  1763.  If the last operand of a conditional expression contains an assignment
  1764. operator, use parentheses to ensure the expression evaluates properly. For
  1765. example, the = operator has higher precedence than the ?: operator in the
  1766. following expression:
  1767.  
  1768.       (i == 7) ? j ++ : k = j;
  1769.  
  1770.  This expression generates an error because it is interpreted as if it were
  1771. parenthesized this way:
  1772.  
  1773.       ((i == 7) ? j ++ : k) = j;
  1774.  
  1775.  That is, k is treated as the third operand, not the entire assignment
  1776. expression k = j.  The error arises because a conditional expression is not an
  1777. lvalue, and the assignment is not valid.
  1778.  
  1779.  
  1780.                                  - Page 25 -
  1781. 46.    Conditional expressions
  1782.  
  1783.  To make the expression evaluate correctly, enclose the last operand in
  1784. parentheses:
  1785.  
  1786.       (i == 7) ? j ++ : (k = j);
  1787.  
  1788. 47.    Assignment expressions
  1789.  
  1790.  An assignment expression gives a value to the left operand.
  1791.  
  1792.  The left operand in all assignment expressions must be a variable. The value
  1793. of the expression is the value of the left operand after the assignment is
  1794. completed.
  1795.  
  1796.  The language contains two types of assignment operators,  simple assignment 
  1797. and  compound assignment  operators.
  1798.  
  1799. 48.    Simple assignment =
  1800.  
  1801.  The simple assignment operator gives the value of the right operand to the
  1802. left operand.
  1803.  
  1804.  The following example assigns in order the value 0 (zero) to strangeness, the
  1805. value of strangeness to charm, the value of charm to beauty, and the value of
  1806. beauty to truth:
  1807.  
  1808.     truth = beauty = charm = strangeness = 0;
  1809.  
  1810. 49.    Compound assignment
  1811.  
  1812.  The compound assignment operators perform an operation on both operands and
  1813. give the result of that operation to the left operand.
  1814.  
  1815.  The following table lists the compound assignment operators and shows an
  1816. expression using each operator:
  1817.  
  1818.  Operator        Example                 Equivalent Expression
  1819.  --------        -------                 ---------------------
  1820.  +=              index   +=  2           index   = index + 2
  1821.  -=              balance -=  debit       balance = balance - debit
  1822.  *=              bonus   *=  increase    bonus   = bonus * increase
  1823.  /=              time    /=  hours       time    = time / hours
  1824.  %=              allow   %=  1000        allow   = allow % 1000
  1825.  <<=             result  <<= num         result  = result << num
  1826.  >>=             form    >>= 1           form    = form >> 1
  1827.  &=              mask    &=  2           mask    = mask &  2
  1828.  ^=              test    ^= pre_test     test    = test ^ pre_test
  1829.  |=              flag    |=  on          flag    = flag | on
  1830.  
  1831.  
  1832.  Although the equivalent expression column shows the left operands (from the
  1833. example column) evaluated twice, the left operand is evaluated only once.
  1834.  
  1835. Note that the expression
  1836.  
  1837.     a *= b + c
  1838.  
  1839. is equivalent to
  1840.  
  1841.     a = a * (b + c)
  1842.  
  1843. and NOT
  1844.  
  1845.     a = a * b + c.
  1846.  
  1847. 50.    Comma expressions
  1848.  
  1849.  A comma expression contains two operands separated by a comma operator.
  1850.  
  1851.                                  - Page 26 -
  1852. 50.    Comma expressions
  1853.  
  1854. Although both operands are evaluated, the value of the right operand is the
  1855. value of the expression. The left operand is evaluated, possibly producing
  1856. side effects, and then the value is discarded.
  1857.  
  1858.  In the following example, if omega has the value 11, the expression
  1859. increments delta and assigns the value 3 to alpha:
  1860.  
  1861.       alpha = (delta++, omega % 4);
  1862.  
  1863.  Any number of expressions separated by commas can form a single expression.
  1864. The leftmost expression is evaluated first. The value of the rightmost
  1865. expression becomes the value of the entire expression. For example, the value
  1866. of the expression
  1867.  
  1868.       intensity++, shade * increment, rotate(direction);
  1869.  
  1870. is the value of the expression
  1871.  
  1872.       rotate(direction);
  1873.  
  1874. Restrictions
  1875.  
  1876.  You can place comma expressions within lists that contain commas (for
  1877. example, argument lists and initializer lists). However, because the comma has
  1878. a special meaning, you must place parentheses around comma expressions in
  1879. these lists. The comma expression t = 3, t + 2 is contained in the following
  1880. function call:
  1881.  
  1882.       f(a, (t = 3, t + 2), c);
  1883.  
  1884. The arguments to the function f are: the value of a, the value 5, and the
  1885. value of c.
  1886.  
  1887. 51.    Keywords
  1888.  
  1889.  FPL supplies a number of keywords that'll help executing the program. (You
  1890. might recognize several of them from the C programming language, but please
  1891. read the descriptions carefully cause some of the keywords behave in a
  1892. slightly different way in FPL.)
  1893.  
  1894.  These keywords are e.g looping  functions  and conditional checks etc. The
  1895. "arguments" to these keywords are a bit special and tricky, they are therefore
  1896. not included in this table. Refer to keyword reference for proper syntax.
  1897.  
  1898.   Keyword        Short Description
  1899.   --------       -----------
  1900.    auto          No global variable.
  1901.    break         Break out of a number of levels of loop braces.
  1902.    case          Used in switch() statements for a specific case.
  1903.    char          Create a 8-bit signed numerical variable.
  1904.    const         Constant variable.
  1905.    continue      Continue the loop.
  1906.    debug         Control debug mode.
  1907.    default       Specifies default action in a switch() statement.
  1908.    do            do {statement} while (expression);
  1909.    exit          Stop executing this FPL routine.
  1910.    for           for(statement1;statement2;statement3)
  1911.    if            if(condition) {statement} [else {statement}]
  1912.    int           Creates an 32-bit integer variable.
  1913.    long          Equivalent to `int'.
  1914.    register      No global variable.
  1915.    resize        Resize a variable array.
  1916.    return        Return from subroutine.
  1917.    short         Create a 16-bit signed numerical variable.
  1918.    static        Remember local variables between invokes.
  1919.    string        Creates a string variable named [name].
  1920.    switch        Do different actions on different results.
  1921.  
  1922.                                  - Page 27 -
  1923. 51.    Keywords
  1924.  
  1925.    typedef       Make declarator aliases.
  1926.    volatile      FPL variables are always volatile.
  1927.    while         while(condition) {statement} [else {statement}]
  1928.  
  1929. These keywords are reserved for FPL use, but do nothing today:
  1930.  
  1931.   'double'     Not implemented.
  1932.   'enum'       Not implemented.
  1933.   'float'      Not implemented.
  1934.   'signed'     ALL variables are always signed.
  1935.   'struct'     Not implemented.
  1936.   'union'      Not implemented.
  1937.   'unsigned'   Not implemented.
  1938.  
  1939. 52.    break
  1940.  
  1941. SYNTAX  break [expression];
  1942.  
  1943. DESCRIPTION
  1944.         A break statement enables you to end iterative (do, for, while,
  1945.         switch statements and exit from them at any point other than the
  1946.         logical end.
  1947.  
  1948.         The break statement ends the loop or switch and moves control to the
  1949.         next statement outside the loop/switch. Within nested statements,
  1950.         break ends only the smallest enclosing do, for, while or switch
  1951.         statement as default.
  1952.  
  1953.         The possible "else" statement after a while, is *NOT* a loop.
  1954.  
  1955.         Specifying a following expression breaks out of a number of iterative
  1956.         statements.
  1957.  
  1958. RESTRICTIONS
  1959.         Place a break statement only in the body of an iterative statement.
  1960.  
  1961. EXAMPLES
  1962.  
  1963.         The following example shows a break statement in the action part of a
  1964.         for statement. If the i*3 is equal to 9, the break statement causes
  1965.         the for statement to end.
  1966.  
  1967.           for (i = 0; i < 5; i++) {
  1968.             if (i*3 == 9)
  1969.               break;
  1970.             length++;
  1971.           }
  1972.  
  1973.         Break out of a number of loops by giving an argument:
  1974.  
  1975.           for(i = 0; i < 5 ; i++) {
  1976.             for(j = 0; j < 5 ; j++) {
  1977.               if(i*5+j>18) {
  1978.                 break 2; // Breaks out of two `for' loops!
  1979.               }
  1980.             }
  1981.           }
  1982.  
  1983.         Break out of a switch() statement:
  1984.  
  1985.           switch(i) {
  1986.             case 2:
  1987.               break;
  1988.  
  1989.             default:
  1990.           }
  1991.  
  1992.  
  1993.                                  - Page 28 -
  1994. 52.    break
  1995.  
  1996. SEE      do ,  for ,  while ,  switch 
  1997.  
  1998. 53.    case
  1999.  
  2000. SYNTAX  case expression: statement;
  2001.  
  2002. DESCRIPTION
  2003.         The 'case' statement can only be used within a switch statement. It
  2004.         tells that the following statements should be run if the result of
  2005.         the case expression is the result of the switch expression.
  2006.  
  2007.         The expression must be followed by a colon ':'.
  2008.  
  2009.         Break the case statement with a 'break'. Then the execution will
  2010.         continue after the switch() statement.
  2011.  
  2012. NOTE
  2013.         If the expression contains a colon ':', it must be with parentheses
  2014.         or it can confuse the interpreter under certain conditions.
  2015.  
  2016. EXAMPLE
  2017.         The following program show a switch() statement with three cases:
  2018.  
  2019.           switch( Character() ) {
  2020.             case '\t':
  2021.             case ' ':
  2022.               a = 0;
  2023.               break;
  2024.  
  2025.             case '\n':
  2026.               a = -1;
  2027.               break;
  2028.  
  2029.             default:
  2030.               a = 1;
  2031.               break;
  2032.           }
  2033.  
  2034. SEE ALSO
  2035.          switch ,  break ,  default 
  2036.  
  2037. 54.    char
  2038.  
  2039. SYNTAX  char name [= expression];
  2040.  
  2041. DESCRIPTION
  2042.         Declares a char (signed 8-bit) variable (and assign a value to it).
  2043.         Read more about it the chapter discussing variables. Not assigned
  2044.         variables equals zero (0) after declaration.
  2045.  
  2046. INPUTS  string name     - The variable name.
  2047.         char expression - Initial expression.
  2048.  
  2049. SEE      int    
  2050.          short  
  2051.          string 
  2052.  
  2053. 55.    continue
  2054.  
  2055. SYNTAX  continue;
  2056.  
  2057. DESCRIPTION
  2058.         A continue statement enables you to stop the current iteration of a
  2059.         loop. Program control is passed from the location in the body of the
  2060.         loop where the continue is found, to the condition part of the loop.
  2061.  
  2062.         The continue statement ends the execution of the action part of a do,
  2063.  
  2064.                                  - Page 29 -
  2065. 55.    continue
  2066.  
  2067.         for, or while statement and moves control to the condition part of
  2068.         the statement. If the iterative statement is a for statement, control
  2069.         moves to the third expression in the condition part of the statement,
  2070.         then to the second expression (the test) in the condition part of the
  2071.         statement.
  2072.  
  2073.         Within nested statements, the continue statement ends only the
  2074.         current iteration of the do, for or while statement immediately
  2075.         enclosing it.
  2076.  
  2077. RESTRICTIONS
  2078.         Place a continue statement only within the body of an iterative
  2079.         statement.
  2080.  
  2081. EXAMPLES
  2082.         The following example shows a continue statement in a for statement.
  2083.         The continue statement causes the system to skip over those elements
  2084.         of the formula that have values less than or equal to 100.
  2085.  
  2086.           output("Try this calculation while <=100.\n");
  2087.           for (i = 0; i < 10000; i++) {
  2088.             if (i*(3-b/c+a) <= 100)
  2089.               continue;
  2090.             output("The number ", i, " makes it no longer below!");
  2091.           }
  2092.  
  2093. SEE      do ,  for ,  while 
  2094.  
  2095. 56.    default
  2096.  
  2097. SYNTAX  default: statement;
  2098.  
  2099. DESCRIPTION
  2100.         The 'default' statement can only be used within a switch statement.
  2101.         It tells that the following statements is the default action if no
  2102.         case expressions match the switch expression.
  2103.  
  2104.         The keyword must be followed by a colon ':'.
  2105.  
  2106.         Break the default statement with a 'break'. Then the execution will
  2107.         continue after the switch() statement.
  2108.  
  2109. EXAMPLE
  2110.         This program executes the 'default' statement if 'x' does not match
  2111.         "foo" or "bar":
  2112.  
  2113.           switch(x) {
  2114.             case "foo":         /* if x is "foo" */
  2115.             case "bar":         /* if x is "bar" */
  2116.               /* nananana */
  2117.               break;            /* break out of switch */
  2118.  
  2119.             default:
  2120.               foobar();         /* if x isn't "foo" or "bar" */
  2121.               break;
  2122.           }
  2123.  
  2124. SEE ALSO
  2125.          switch ,  break ,  case 
  2126.  
  2127. 57.    do
  2128.  
  2129. SYNTAX  do statement; while ( expression ) ;
  2130.  
  2131. DESCRIPTION
  2132.         A do statement repeatedly executes a statement until a test
  2133.         expression evaluates to 0 (zero). Because of this order of
  2134.  
  2135.                                  - Page 30 -
  2136. 57.    do
  2137.  
  2138.         processing, the statement is processed at least once.
  2139.  
  2140.         The body of the loop is run before the controlling while clause is
  2141.         evaluated. Further processing of the do statement depends on the
  2142.         value of the while clause. If the while clause does not evaluate to
  2143.         0 (zero), the statement runs again. Otherwise, processing of the
  2144.         statement ends.
  2145.  
  2146.         A break or return statement can cause the processing of a do
  2147.         statement to end, even when the while clause does not evaluate to 0
  2148.         (zero).
  2149.  
  2150. EXAMPLES
  2151.         The following statement prompts the system user to enter a 1. If the
  2152.         system user enters a 1, the statement ends execution.  If not, the
  2153.         statement displays another prompt.
  2154.  
  2155.           do {
  2156.             input("Enter a 1!", reply);
  2157.           } while (reply != 1);
  2158.  
  2159. SEE      break ,  continue ,  return 
  2160.  
  2161. 58.    debug    
  2162.  
  2163. SYNTAX  int debug ( Enable );                                   (V9)
  2164.  
  2165. DESCRIPTION
  2166.          Toggles the "debug mode" state. When FPL runs in the "debug mode",
  2167.         the debugger is capable of tracing the FPL executions.
  2168.  
  2169.          If called without parameter, it will return the current "debug mode"
  2170.         status.
  2171.  
  2172. NOTE
  2173.         The FPL debugger is not extensively used, developed or spread. Much
  2174.         more documentation regarding this function and FPL debugging concepts
  2175.         and procedures will appear in future versions of this document.
  2176.  
  2177. INPUTS
  2178.         int Enable      - Zero to disable, non-zero to enable.
  2179.  
  2180. RETURNS
  2181.         It returns the "debug mode" state that was when the function was
  2182.         called. That is, if you enable debug mode, it will return the state
  2183.         previous to this function call.
  2184.  
  2185. SEE
  2186.  
  2187. 59.    else
  2188.  
  2189. SYNTAX  <special>
  2190.  
  2191. DESCRIPTION
  2192.         Used after condition checks to make FPL execute certain parts of the
  2193.         program if the previous check did not evaluate true.
  2194.  
  2195.         It always belongs to the last `if'/`while' in this block.
  2196.  
  2197. EXAMPLES
  2198.         It can be used in simple one time checks like:
  2199.  
  2200.           if(a!=2)
  2201.             break;
  2202.           else
  2203.             output("hello");  /* only executed if variable a equals 2 */
  2204.  
  2205.  
  2206.                                  - Page 31 -
  2207. 59.    else
  2208.  
  2209.         and even if a while loop never is executed:
  2210.  
  2211.           while(a--)
  2212.             output(a);
  2213.           else
  2214.             output("hello"); // only executed if the while condition never
  2215.                              // was true.
  2216.  
  2217.         Take a look at the two examples below and note the difference!
  2218.  
  2219.         1. If both "a" and "b" are true, then invoke "build_new_things". if
  2220.            "a" is false, invoke "crash_mostofit":
  2221.  
  2222.           if(a) { // braces are required if we want the `else' to affect this
  2223.             if(b) 
  2224.               build_new_things();
  2225.           } else
  2226.             crash_mostofit();
  2227.  
  2228.         2. If "a" and "b" are true, then invoke "build_new_things". If "a" is
  2229.            true and "b" is false, invoke "crash_mostofit":
  2230.  
  2231.           if(a) // without braces, the else suddenly affects the other if!
  2232.             if(b) 
  2233.               build_new_things();
  2234.             else
  2235.               crash_mostofit();
  2236.  
  2237. 60.    exit
  2238.  
  2239. SYNTAX  exit( return_code );
  2240.  
  2241. DESCRIPTION
  2242.         Stop execution of the current FPL routine.
  2243.  
  2244. INPUTS  int/string return_code  - Return code to return to the calling
  2245.                                   process.
  2246.  
  2247.         See the documentation for the software you're controlling for the
  2248.         exact meaning of these return codes. The return code can be excluded
  2249.         as well as the parenthesis can when returning a value.
  2250.  
  2251. RETURNS
  2252.         A result code to the invoking environment.
  2253.  
  2254. SEE ALSO
  2255.          return 
  2256.  
  2257. 61.    export
  2258.  
  2259. SYNTAX  export [ global declaration ];
  2260.  
  2261. DESCRIPTION
  2262.         Make the following global symbol available to all programs.
  2263.  
  2264. EXAMPLES
  2265.         The following statements make the function "foobar" and the string
  2266.         variable "String" accessiable to all other FPL programs that will
  2267.         succeed this program:
  2268.  
  2269.           export string String;
  2270.           export int foobar(int);
  2271.           /* the actual function foobar must reside in the same source file */
  2272.  
  2273. 62.    for
  2274.  
  2275. SYNTAX  for ([expression1] ; [expression2] ; [expression3]) statement;
  2276.  
  2277.                                  - Page 32 -
  2278. 62.    for
  2279.  
  2280.  
  2281. DESCRIPTION
  2282.         Expression1
  2283.           is evaluated only before the statement is processed for the first
  2284.           time. You can use this expression to initialize a variable. If you
  2285.           do not want to evaluate an expression prior to the first iteration
  2286.           of the statement, you can omit this expression.
  2287.  
  2288.         Expression2
  2289.           is evaluated before each iteration of the statement. The expression
  2290.           must evaluate to a scalar type. If it evaluates to 0 (zero), the
  2291.           statement is not processed and control moves to the next statement
  2292.           following the for statement. If expression2 does not evaluate to 0,
  2293.           the statement is processed. If you omit expression2, it is as if
  2294.           the expression had been replaced by a nonzero constant and the for
  2295.           statement is not terminated by failure of this condition.
  2296.  
  2297.         Expression3
  2298.           is evaluated after each iteration of the statement. You can use
  2299.           this expression to increase, decrease, or reinitialize a variable.
  2300.           If you do not want to evaluate an expression after each iteration
  2301.           of the statement, you can omit this expression.
  2302.  
  2303.         A break or return statement can cause the processing of a for
  2304.         statement to end, even when the second expression does not evaluate
  2305.         to 0 (zero). If you omit expression2, you must use a break or a
  2306.         return statement to stop the the for statement from running.
  2307.  
  2308. EXAMPLES
  2309.  
  2310.         The following for statement prints the value of count 20 times. The
  2311.         for statement initially sets the value of count to 1. After each
  2312.         iteration of the statement, count is incremented.
  2313.  
  2314.           for (count = 1; count <= 20; count++) {
  2315.             output("count =", count);
  2316.           }
  2317.  
  2318.         The following sequence of statements accomplishes the same task. Note
  2319.         the use of the while statement instead of the for statement.
  2320.  
  2321.           count = 1;
  2322.           while (count <= 20) {
  2323.             output("count = ", count);
  2324.             count++;
  2325.           }
  2326.  
  2327.         The following for statement does not contain an initialization
  2328.         expression.
  2329.  
  2330.           for (; index > 10; index--) {
  2331.             list= var1 + index;
  2332.             output("list = ", list, "\n");
  2333.           }
  2334.  
  2335.         The following for statement continues running until input receives
  2336.         the letter e:
  2337.  
  2338.           for (;;) {
  2339.             input("Gimme an e!", letter);
  2340.             if (!strcmp(letter, "\n"))
  2341.               continue;
  2342.             else if (!strcmp(letter, "e"))
  2343.               break;
  2344.             output("You entered the letter", letter);
  2345.           }
  2346.  
  2347.  
  2348.                                  - Page 33 -
  2349. 62.    for
  2350.  
  2351.         The following for statement contains multipart initializations and
  2352.         increments.  The comma operator makes this construction possible.
  2353.  
  2354.           for (i = 0, j = 50; i < 10; i++, j += 50) {
  2355.             output("i = ", i, " and j = ", j);
  2356.           }
  2357.  
  2358.         The following example shows a nested for statement. The outer
  2359.         statement is run as long as the value of row is less than 5. Each
  2360.         time the outer for statement is processed, the inner for statement
  2361.         sets the initial value of column to zero and the statement of the
  2362.         inner for statement is run three times. The inner statement is run
  2363.         as long as the value of column is less than 3.
  2364.  
  2365.           for (row = 0; row < 5; row++) {
  2366.             for (column = 0; column < 3; column++)
  2367.               output("column * row =", row * column, "\n");
  2368.  
  2369.         A never-ending loop using `for':
  2370.  
  2371.           for(;;)
  2372.             perform_until_death();
  2373.  
  2374. SEE      break , continue, do, while
  2375.  
  2376. 63.    if
  2377.  
  2378. SYNTAX  if ( expression ) statement; [ else  statement;  ]
  2379.  
  2380. DESCRIPTION
  2381.         An if statement allows you to conditionally process a statement if
  2382.         the specified test expression evaluates to a nonzero value. You can
  2383.         optionally specify an else clause on the if statement. If the test
  2384.         expression evaluates to 0 (zero), and an else clause exists, the
  2385.         statement in the else clause is run. If the test expression evaluates
  2386.         to a nonzero value, the statement following the expression runs and
  2387.         the else clause is ignored.
  2388.  
  2389.         When if statements are nested and else clauses are present, a given
  2390.         else is associated with the closest preceding if statement within the
  2391.         same block.
  2392.  
  2393. EXAMPLES
  2394.         The following example causes grade to receive the value A if the
  2395.         value of score is greater than or equal to 90.
  2396.  
  2397.           if (score >= 90)
  2398.             grade = A;
  2399.  
  2400.         The following example displays number is positive if the value of
  2401.         number is greater or equal to 0 (zero). Otherwise, the example
  2402.         displays number is negative.
  2403.  
  2404.           if (number >= 0)
  2405.             output("number is positive\n");
  2406.           else
  2407.             output("number is negative\n");
  2408.  
  2409.  
  2410.         The following example shows a nested if statement:
  2411.  
  2412.           if (paygrade == 7)
  2413.             if (level >= 0 && level <= 8)
  2414.               salary *= 2;
  2415.             else
  2416.               salary *= 3;
  2417.           else
  2418.  
  2419.                                  - Page 34 -
  2420. 63.    if
  2421.  
  2422.              salary *= 4;
  2423.  
  2424.  
  2425.         The following example shows an if statement that does not have an
  2426.         else clause.
  2427.  
  2428.           if (gallons > 0) {
  2429.             if (miles > gallons)
  2430.               mpg = miles/gallons;
  2431.           } else
  2432.             mpg = 0;
  2433.  
  2434.  
  2435.         The following example shows an if statement nested within an else
  2436.         clause. This example tests multiple conditions.  The tests are made
  2437.         in order of their appearance. If one test evaluates to a nonzero
  2438.         value, an action statement runs and the entire if statement ends.
  2439.  
  2440.           if (value > 0)
  2441.              increase++;
  2442.           else if (value == 0)
  2443.              breaeven++;
  2444.           else
  2445.              ++decrease;
  2446.  
  2447. 64.    int
  2448.  
  2449. SYNTAX  int name [= expression];
  2450.  
  2451.           or
  2452.  
  2453.         long name [= expression];
  2454.  
  2455. DESCRIPTION
  2456.         Declare an integer (signed 32-bit) variable and assign a value to it.
  2457.         Read more about it the chapter discussing variables. Not assigned
  2458.         variables equals zero (0) after declaration.
  2459.  
  2460.         ANSI C specifies that `long' should be a 32-bit number and `int' is
  2461.         more vague. The MC680x0 processor series has - as all decent
  2462.         processors have - 32-bit integers, which make them the exact same
  2463.         data type. FPL is mostly run on such processors making this
  2464.         equivalence natural.
  2465.  
  2466. INPUTS  string name             - The variable name.
  2467.         int/long expression     - Initial expression.
  2468.  
  2469. SEE      string ,  char   ,  short  
  2470.  
  2471. 65.    resize
  2472.  
  2473. SYNTAX  resize name [ new_size ] ;
  2474.  
  2475. DESCRIPTION
  2476.         A common problem when using arrays is that you don't know the size of
  2477.         it already from the start. This keyword brings a solution to that
  2478.         problem. This one resizes the named array to the new size you specify
  2479.         inside the square brackets. Notice that it's also possible to reduce
  2480.         the size, so be careful not to destroy data you like to reuse.
  2481.  
  2482.         WARNING: Using multi dimensional arrays and `resize' is a dangerous
  2483.         combination. E.g when changing an array from "[4][5]" to "[5][5]",
  2484.         the old values will not any longer be readable in their old array
  2485.         members. A resize of this kind makes the data move around a bit
  2486.         depending on the internal data array storage. DO NOT USE `resize' IN
  2487.         MULTI DIMENSIONAL ARRAYS IF YOU WANT THE DATA TO STAY INTACT!
  2488.  
  2489.  
  2490.                                  - Page 35 -
  2491. 65.    resize
  2492.  
  2493. INPUTS
  2494.         name            - The name of the array you'd like to resize.
  2495.         new_size        - The new size of the array.
  2496.  
  2497. EXAMPLES
  2498.         To make a list of all the names the user enters, you need an array as
  2499.         big as the user pleases. But declaring an enormous size from the
  2500.         start really isn't to recommend. This example shows one way to solve
  2501.         such a problem:
  2502.  
  2503.           int roof=10, num;
  2504.           string names[roof];
  2505.           do {
  2506.             if(num==roof)
  2507.               resize names[roof+=10];
  2508.             names[num]=input("Insert name number " num ":");
  2509.           } while(names[num++]!="");
  2510.  
  2511.  
  2512.         Multi dimensional arrays looses their proper values when resizing, do
  2513.         copy the array to preserve to contents:
  2514.  
  2515.           int a[DIM1][DIM2];       // This is the old array construction
  2516.           {
  2517.             /* This could with benefit be written into a function to be
  2518.                called from several instances */
  2519.  
  2520.             int n1, n2;              // counter variables
  2521.             int b[NEWDIM1][NEWDIM2]; // The temporary new array outfit!
  2522.  
  2523.             for(n1=0; n1<DIM1 && n1<NEWDIM1; n1++)   // temporary store all
  2524.               for(n2=0; n2<DIM2 && n2<NEWDIM2; n2++) // vital data in array b
  2525.                 b[n1][n2]=a[n1][n2];
  2526.  
  2527.             resize a[NEWDIM1][NEWDIM2]; // resize a
  2528.  
  2529.             for(n1=0; n1<NEWDIM1; n1++)   // restore all data to array a
  2530.               for(n2=0; n2<NEWDIM2; n2++)
  2531.                 a[n1][n2]=b[n1][n2];
  2532.           }
  2533.  
  2534. 66.    return
  2535.  
  2536. SYNTAX  return [ return_code ];
  2537.  
  2538. DESCRIPTION
  2539.         A return statement ends the execution of the current function and
  2540.         returns a return code and control to the caller of it. The return
  2541.         code is written exact as in C, within parentheses or not. It can
  2542.         also be totally excluded.
  2543.  
  2544. EXAMPLES
  2545.         We use a function to print the result of the formula, but only if
  2546.         the result is even:
  2547.  
  2548.           int n;
  2549.           int print(int);
  2550.           for(n=0; n<10; n++)
  2551.             n+=printf(n*n);
  2552.           exit;
  2553.  
  2554.           int print(int a)
  2555.           {
  2556.             if(!(a&1))
  2557.               output(a);
  2558.              return(a&2);  /* Get back to the for loop */
  2559.           }
  2560.  
  2561.                                  - Page 36 -
  2562. 66.    return
  2563.  
  2564.  
  2565. SEE      exit ,  break 
  2566.  
  2567. 67.    short
  2568.  
  2569. SYNTAX  short name [= expression];
  2570.  
  2571. DESCRIPTION
  2572.         Declares a short (signed 16-bit) variable (and assigns a value to
  2573.         it). Read more about it the chapter discussing variables. Not
  2574.         assigned variables equal zero (0) after declaration.
  2575.  
  2576. INPUTS  string name        - The variable name.
  2577.         short expression   - Initial expression.
  2578.  
  2579. SEE     int , char, string
  2580.  
  2581. 68.    string
  2582.  
  2583. * Strings are always written enclosed within quotation marks (").
  2584.  
  2585. * To read the ASCII value of a single character within a string, use
  2586.   square brackets in the form: name[index] where name is the name of
  2587.   the string variable (could of course also be an array member) and   index is
  2588. the column you want to check out. Index below zero or above
  2589.   the length of the source string will result in error. The following
  2590.   example outputs all ASCII codes in a string:
  2591.  
  2592.      string  str = "hello world";
  2593.      int  ascii, n;
  2594.      while ( ascii = str[n++] ) {
  2595.        output ( ascii "n" );
  2596.     }
  2597.  
  2598.   This example will output all ASCII values in column 2 in the strings
  2599.   in the array:
  2600.  
  2601.      string  str[3] = {"hello", "world", "string"};
  2602.      int  n;
  2603.      for ( n = 0; n < 3; n++ ) {
  2604.        output ( str[n][2] "n" )
  2605.     }
  2606.  
  2607.   Reading beyond the end of a string simply returns a zero, while
  2608.   reading a negative column will result in an error.
  2609.  
  2610. * Strings not enclosed within quotes are assumed to be variable names.
  2611.  
  2612.   Note the difference between:
  2613.  
  2614.     output("Hello");
  2615.  
  2616.   and
  2617.  
  2618.     output(Hello);
  2619.  
  2620.   (Example 1 outputs the actual string "Hello", while example 2 outputs
  2621.   the contents of the variable *named* "Hello".)
  2622.  
  2623. * Append strings to a string variable by using the '+=' operator. Ex:
  2624.  
  2625.     string a="Hello ";
  2626.     a+="world";
  2627.     output(a);
  2628.  
  2629.   Outputs the string "Hello world" on the screen.
  2630.  
  2631.  
  2632.                                  - Page 37 -
  2633. 68.    string
  2634.  
  2635.     string a = "Hello ";
  2636.     string b ="world";
  2637.     output( a + b );
  2638.  
  2639. * Special characters within strings should be symbolized with backslash
  2640.   and a character just as in the good old C standard:
  2641.   a    - Alert (bell)
  2642.   b    - Backspace
  2643.   f    - Form feed (new page)
  2644.   n    - New-line
  2645.   r    - Carriage return
  2646.   t    - Horizontal tab
  2647.   v    - Vertical tab
  2648.   '    - Single quotation mark
  2649.   "    - Double quotation mark
  2650.   ?    - Question mark
  2651.   \    - Backslash
  2652.   xhh  - hex number, where "hh" is a two digit hexadecimal value.
  2653.   nnn  - octal number, where "nnn" is a three digit octal value.
  2654.  
  2655. See also the function reference for string handling functions such as
  2656.  strcmp(), strncmp(), substr(), eval() and more.
  2657.  
  2658. 69.    typedef
  2659.  
  2660. SYNTAX  typedef <declarator> <symbol>;
  2661.  
  2662. DESCRIPTION
  2663.         `typedef' allows you to define your own identifiers that can be used
  2664.         in place of FPL type specifiers such as int, string and char. The
  2665.         data types you define using `typedef' are not new data types; they
  2666.         are synonyms for the primary data types used by FPL.
  2667.  
  2668. EXAMPLES
  2669.         This example creates a synonym for int and then use that to declare
  2670.         three integral variables:
  2671.  
  2672.                 typedef int LENGTH;     /* new declarator named `LENGTH' */
  2673.                 LENGTH length, width, height;
  2674.  
  2675. 70.    switch
  2676.  
  2677. SYNTAX  switch ( expression ) { [case expression:] [default:expression] }
  2678.  
  2679. DESCRIPTION
  2680.         A switch statement lets you define actions to different results of
  2681.         the switch expression.
  2682.  
  2683.         The result of the expression written within the parentheses following
  2684.         the switch keyword is matched against the expressions following the
  2685.         ' case ' keywords within the braces. If no match is found the action
  2686.         specified after ' default ' will be run. If no 'default' is defined
  2687.         either, nothing will happen.
  2688.  
  2689.         The switch expression may be either a string or numerical expression.
  2690.         The expressions in the following case statements have to be of the
  2691.         same expression type as the initial one, or FPL will report error.
  2692.  
  2693.         Multiple cases may be specified with the same expression, but only
  2694.         the first one that match the switch expression will be run.
  2695.  
  2696.         A case statement is aborted by a  break  statement or the brace
  2697.         ending the switch statement.
  2698.  
  2699. NOTE
  2700.         Unlike C, FPL handles dynamic expressions in case-statements very
  2701.         well!
  2702.  
  2703.                                  - Page 38 -
  2704. 70.    switch
  2705.  
  2706.  
  2707.         The case statements will be parsed/scanned from the top to bottom.
  2708.         For speed reasons, you should put the case-statements that occur
  2709.         most likely at the top and the least likely case-statements at
  2710.         the bottom.
  2711.  
  2712. EXAMPLES
  2713.  
  2714.         In the following program the result from the equation 'x+5' is
  2715.         controlling what text to assign to the 'output' variable:
  2716.  
  2717.           int check = x + 5;
  2718.           string output;
  2719.           switch( check ) {
  2720.             case 5:     /* notice the colon that follows the expression */
  2721.               output = "x was zero";
  2722.               break;    /* escape from switch! */
  2723.  
  2724.             case 4:
  2725.               break;    /* do nothing */
  2726.  
  2727.             case 7:
  2728.               /* fall through! */
  2729.  
  2730.             case 8:
  2731.               output = "x was two or three";
  2732.               break;
  2733.  
  2734.             default:
  2735.               output = "x was not from -1 to 3";
  2736.           }   /* breaks out of 'default' */
  2737.  
  2738.         In the following program, the content of the variable 'username' is
  2739.         controlling which function to invoke:
  2740.  
  2741.           string username = getname();  /* get user name */
  2742.           switch(username) {
  2743.             case "superuser":
  2744.               GetSuperUser();
  2745.               break;
  2746.  
  2747.             case "normal":
  2748.               GetNormalUser();
  2749.               break;
  2750.  
  2751.             case "unworthy":
  2752.               GetUnworthyUser();
  2753.               break;
  2754.           }
  2755.  
  2756. 71.    while
  2757.  
  2758. SYNTAX  while ( expression )  statement ; [  else  statement; ]
  2759.  
  2760. DESCRIPTION
  2761.         A while statement enables you to repeatedly run the body of a loop
  2762.         until the controlling expression is no longer met or evaluates to 0
  2763.         (zero.)
  2764.  
  2765.         The expression is evaluated to determine whether or not the body of
  2766.         the loop should be run. If the expression evaluates to 0 (zero), the
  2767.         body of the loop never runs. If not, the body is processed. After the
  2768.         body has run, control passes back to the expression. Further
  2769.         processing depends on the value of the condition.
  2770.  
  2771.         When coding in 'C', I've always missed the "while else" function. FPL
  2772.         includes that feature! If the test expression evaluates to false
  2773.  
  2774.                                  - Page 39 -
  2775. 71.    while
  2776.  
  2777.         (zero) the FIRST TIME it's evaluated, and an "else" clause exists,
  2778.         the statement in the "else" clause is run. If the test expression
  2779.         evaluates to a nonzero value, the statement following the expression
  2780.         runs and the "else" clause is ignored.
  2781.  
  2782.         A break or return statement can cause the processing of a while
  2783.         statement to end, even when the condition does not evaluate to 0
  2784.         (zero).
  2785.  
  2786.         NOTE: The else clause is *NOT* a loop. "break" is not a valid move to
  2787.         break out of such.
  2788.  
  2789. EXAMPLES
  2790.  
  2791.         In the following program, item triples each time the value of the
  2792.         expression index++ is less than MAX_INDEX. When index++ evaluates to
  2793.         MAX_INDEX, the while statement ends.
  2794.  
  2795.           while (index < MAX_INDEX) {
  2796.             item *= 3;
  2797.             output("item = ", item, "\n");
  2798.             index++;
  2799.           }
  2800.  
  2801.         The following program first checks if a<0 and if it is, increases a
  2802.         with 100 until it isn't any longer less than zero. If not, it'll
  2803.         output a message saying so.
  2804.  
  2805.           while(a<0)
  2806.             a+=100;
  2807.           else
  2808.             output("a was never below 0\n");
  2809.  
  2810.  
  2811. SEE      break ,  return , continue
  2812.  
  2813. 72.    Functions
  2814.  
  2815.   These are the internal functions supplied from the start by FPL:
  2816.  
  2817.   Function          Argument(s)     Short Description
  2818.   --------          -----------     -----------------
  2819.   
  2820.    abs              int           Absolute value of integer operand.
  2821.    atoi             str           Convert a string to an integer.
  2822.    eval             str           Calculate a string.
  2823.    interpret        str           Interpret string as program.
  2824.    itoa             int           Convert an integer to string.
  2825.    itoc             int           Convert an integer to ASCII.
  2826.    joinstr          str, ...      Joins strings!
  2827.    ltostr           n1, n2        Convert an integer to string.
  2828.    sprintf                        Formatted print to a string.
  2829.    strcmp           str1, str2    Compare two strings.
  2830.    stricmp          str1, str2    Compare two strings. CI(*)
  2831.    strlen           str]          String length.
  2832.    strncmp          str1, str2, n Compare two strings a certain length.
  2833.    strnicmp         str1, str2, n Compare two strings a certain length. CI(*)
  2834.    strstr           str1, str2    Find substring str1 in string str2.
  2835.    stristr          str1, str2    Find substring str1 in string str2. CI(*)
  2836.    strtol           str, base     Convert string to integer.
  2837.    substr           s1, col, len  Get part of string.
  2838.  
  2839.  [Amiga only:]
  2840.  
  2841.    openlib          lib, ver        Open funclib.
  2842.    closelib         lib             Close funclib.
  2843.  
  2844.  
  2845.                                  - Page 40 -
  2846. 72.    Functions
  2847.  
  2848. (*) = Case insensitive. It doesn't make any difference to 'A' or 'a'.
  2849.       It does only apply to ASCII characters; that is only a-z and A-Z.
  2850.  
  2851. 73.    abs
  2852.  
  2853. SYNTAX  int abs( Int );
  2854.  
  2855. DESCRIPTION
  2856.         Returns the absolute value of the input integer.
  2857.  
  2858. INPUTS  int Int;
  2859.  
  2860. RETURNS see description.
  2861.  
  2862. 74.    atoi
  2863.  
  2864. SYNTAX  int atoi( String );
  2865.  
  2866. DESCRIPTION
  2867.         The atoi keyword returns an integer whose value is represented by the
  2868.         character string pointed to by the String parameter. atoi scans the
  2869.         string up to the first character that is inconsistent. Leading
  2870.         white-space characters are ignored, and an optional sign may precede
  2871.         the digits.
  2872.  
  2873. INPUTS  string String;
  2874.  
  2875. RETURNS
  2876.         Upon successful completion, atoi returns the converted value. If no
  2877.         conversion could be performed, 0 (zero) is returned. If the correct
  2878.         value is outside the range of representable values, maximum or
  2879.         minimum value is returned according to the sign of the value.
  2880.  
  2881. SEE
  2882.         strtol(), itoa()
  2883.  
  2884. 75.    closelib
  2885.  
  2886. SYNTAX  int closelib( Name );
  2887.  
  2888. DESCRIPTION
  2889.          Closes a specified  funclib . Funclibs are third
  2890.         party programs that add functions to the FPL session. The funclibs
  2891.         should be stored in FPLLIBS:.
  2892.  
  2893.          A closelib() concludes access to the functions of the specified
  2894.         funclib. Each call to  openlib()  should have a matching call to
  2895.         closelib().
  2896.  
  2897.          For information regarding specified funclibs, refer to the manual of
  2898.         the particular funclib.
  2899.  
  2900. INPUTS
  2901.         string Name     - The name of the funclib.
  2902.  
  2903. RETURNS
  2904.         It return 0 on success. Otherwise see 'openlib' for closer
  2905.         description.
  2906.  
  2907. SEE      openlib  and the  funclibs  section.
  2908.  
  2909. 76.    eval
  2910.  
  2911. SYNTAX  int eval( String );
  2912.  
  2913. DESCRIPTION
  2914.         The mathematical expression in String is evaluated and returned.
  2915.  
  2916.                                  - Page 41 -
  2917. 76.    eval
  2918.  
  2919.         eval handles all variables declared before this point of the
  2920.         execution.
  2921.         An error in the expression will unfortunately return 0 which will
  2922.         look like the result of the expression.
  2923.  
  2924. INPUTS  string String   - A string including a valid numerical expression.
  2925.  
  2926. RETURNS
  2927.         The result of the mathematical expression in String or 0 if there was
  2928.         any error in the expression.
  2929.  
  2930. 77.    interpret
  2931.  
  2932. SYNTAX  int interpret( String );                        (V3)
  2933.  
  2934. DESCRIPTION
  2935.         Interprets the argument as if it is a continuation of the program.
  2936.         The argument must be a 100% correct FPL program statement. All
  2937.         variables and functions usable in the program at this point will be
  2938.         usable in the argument-statement too.
  2939.  
  2940.         Any error in this function will get reported at the position right
  2941.         after the function call.
  2942.  
  2943. INPUTS  string String   - FPL statement
  2944.  
  2945. RETURNS
  2946.         At this moment: always zero. But do not depend upon that since it
  2947.         might get changed in the future.
  2948.  
  2949. EXAMPLE
  2950.         This example calls a function via the interpret() function:
  2951.  
  2952.                 int foobar(int);
  2953.                 interpret("foobar(2);");
  2954.                 exit;
  2955.  
  2956.                 int foobar(int b)
  2957.                 {
  2958.                   output(b);
  2959.                 }
  2960.  
  2961.         We can create a function that accepts a function name as parameter
  2962.         and then is able to call that named function:
  2963.  
  2964.                 int foobar(int);
  2965.                 int foo(int);
  2966.                 int bar(int);
  2967.                 int call(string, int);
  2968.  
  2969.                 call("foobar", 1);
  2970.                 call("foo", 2);
  2971.                 call("bar", 3);
  2972.                 exit;
  2973.  
  2974.                 int call(string command, int parameter)
  2975.                 {
  2976.                   int ret;      /* declare return code variable */
  2977.                   string statement=joinstr("ret=", command, "(",
  2978.                                            ltostr(parameter), ");");
  2979.  
  2980.                   output(statement);    /* output the statement */
  2981.                   interpret(statement); /* interpret it */
  2982.                   /*
  2983.                    * At this point `ret' has got the return code
  2984.                    * of the called function.
  2985.                    */
  2986.  
  2987.                                  - Page 42 -
  2988. 77.    interpret
  2989.  
  2990.                   return(ret);
  2991.                 }
  2992.  
  2993.                 /*
  2994.                  * Here should the definitions of the functions
  2995.                  * "foobar", "foo" and "bar" be programmed.
  2996.                  */
  2997.  
  2998. SEE      eval 
  2999.  
  3000. 78.    itoa
  3001.  
  3002. SYNTAX  string itoa( Integer );
  3003.  
  3004. DESCRIPTION
  3005.         The itoa function converts the integer given as argument to a string
  3006.         and returns it. The convertion will use base 10, which creates a
  3007.         decimal number.
  3008.  
  3009. INPUTS
  3010.         int Integer     - Number to be converted.
  3011.  
  3012. RETURNS
  3013.           Upon successful completion, the function returns the converted
  3014.         string. If no conversion could be performed, the returned string is
  3015.         zero-length.
  3016.  
  3017. EXAMPLES
  3018.         Convert the number the variable 'num' holds, to a string:
  3019.  
  3020.           string result= itoa(num);
  3021.  
  3022. SEE     ltostr(), atoi()
  3023.  
  3024. 79.    itoc
  3025.  
  3026. SYNTAX  string itoc( Integer );
  3027.  
  3028. DESCRIPTION
  3029.           The itoc function returns the character with the ASCII code
  3030.         given as argument. Any argument number higher than 255 will be ANDed
  3031.         with 255 internally.
  3032.  
  3033. INPUTS
  3034.         int Integer     - ASCII code of the desired character.
  3035.  
  3036. RETURNS
  3037.           Upon successful completion, the function returns the character
  3038.         as a string.
  3039.  
  3040. EXAMPLES
  3041.         To get the character with ASCII number 137:
  3042.  
  3043.           string result= itoc( 137 );
  3044.  
  3045. SEE      itoa 
  3046.  
  3047. 80.    joinstr
  3048.  
  3049. SYNTAX  string joinstr( String, ... );
  3050.  
  3051. DESCRIPTION
  3052.          This function lets you specify any amount of strings, and returns
  3053.         them all as one concatenated single string.
  3054.  
  3055. INPUT   string String   - Strings to be merged.
  3056.  
  3057.  
  3058.                                  - Page 43 -
  3059. 80.    joinstr
  3060.  
  3061. RETURNS
  3062.         A string holding all joined strings.
  3063.  
  3064. EXAMPLES
  3065.         Merge three strings into one:
  3066.  
  3067.           string a="one ", c="two ", b="three", d;
  3068.           d=joinstr(a, b, c); /* 'd' now holds "one two three" */
  3069.  
  3070. 81.    ltostr
  3071.  
  3072. SYNTAX  string ltostr( Integer, Base );
  3073.  
  3074. DESCRIPTION
  3075.           The ltostr subroutine returns a string which is the first parameter
  3076.         converted using the second parameter as base.
  3077.  
  3078.           If the Base parameter is positive and not greater than 36, then it
  3079.         is used as the base for conversion.
  3080.  
  3081. INPUTS
  3082.         int Integer     - Number to be converted.
  3083.         int Base        - Specifies the base to use for the conversion.
  3084.  
  3085. RETURNS
  3086.           Upon successful completion, the ltostr subroutine returns the
  3087.         converted string. If no conversion could be performed, the returned
  3088.         string is zero-length.
  3089.  
  3090. EXAMPLES
  3091.         Convert the number 1993 to hexadecimal:
  3092.  
  3093.           string result= ltostr(1993, 16);
  3094.  
  3095. SEE     strtol(), itoa()
  3096.  
  3097. 82.    openlib
  3098.  
  3099. SYNTAX  int openlib( Name, Version );
  3100.  
  3101. DESCRIPTION
  3102.          Opens a specified  funclib . Funclibs are third
  3103.         party programs that add functions to the FPL session. The funclibs
  3104.         should be stored in FPLLIBS:.
  3105.  
  3106.          An openlib() gains access to the functions of the specified funclib.
  3107.         After finished using the functions of that funclib, the session
  3108. should
  3109.         be concluded with a call to  closelib() . Each
  3110.         call to openlib() should have a matching call to closelib().
  3111.  
  3112.          For information regarding specified funclibs, refer to the manual of
  3113.         the particular funclib.
  3114.  
  3115. INPUTS
  3116.         string Name     - The name of the funclib.
  3117.         int Version     - The lowest acceptable version of the funclib.
  3118.  
  3119. RETURNS
  3120.         It return 0 on success. Otherwise a non-zero number where the numbers
  3121.         have the following meaning:
  3122.         1 - funclib parameter error
  3123.         2 - internal funclib error
  3124.         3 - failed getting a system resource
  3125.         4 - out of memory error
  3126.         5 - failed loading the funclib (occurs if you open a non-existant
  3127.             funclib).
  3128.  
  3129.                                  - Page 44 -
  3130. 82.    openlib
  3131.  
  3132.         6 - the requested version didn't exist
  3133.         More error codes are likely to be added within short.
  3134.  
  3135. SEE      closelib  and the  funclibs  section.
  3136.  
  3137. 83.    sprintf
  3138.  
  3139. SYNTAX  string sprintf (format, arg1, arg2, ...);
  3140.  
  3141. DESCRIPTION
  3142.  
  3143.         This function produces a string of ASCII characters.
  3144.  
  3145.         The format argument holds a string that contains ordinary
  3146.         characters and conversion specifications that indicate how you
  3147.         want the arguments arg1, arg2, and so on to be printed. The
  3148.         ordinary characters are copied to the result string, but the
  3149.         conversion specifications are replaced with the correctly formatted
  3150.         values of the arguments arg1, arg2, and so on. The first conversion
  3151.         specification is replaced with the formatted value of arg1, the
  3152.         second specification is replaced with the value of arg2, and so
  3153.         on. In some cases, as described below, a conversion specification
  3154.         may process more than one argument.
  3155.  
  3156.         Each conversion specification must begin with a percent character
  3157.         (%). To place an ordinary percent into the output stream, precede
  3158.         it with another percent in the fmt string. That is, %% will send
  3159.         a single percent character to the output stream. A specification
  3160.         has the following format:
  3161.  
  3162.             %[arg][flags][width][.precision][size]type
  3163.  
  3164.         The brackets ([]) indicate optional fields.  Each field is defined
  3165.         as follows:
  3166.  
  3167.             arg
  3168.                 FPL supports the argument number selection style $<arg>.
  3169.                 When an argument number has been given, that specified
  3170.                 argument will be used instead of the next one in turn.
  3171.                 I.e "%$2d" will produce a formatted integer found as the
  3172.                 second argument. You should *not* mix specified arugment
  3173.                 numbers with %-codes with unspecified arugment numbers.
  3174.  
  3175.             flags
  3176.                 controls output justification and the printing of signs,
  3177.                 blanks, decimal places, and hexadecimal prefixes.
  3178.  
  3179.                 If any flag characters are used, they must appear after
  3180.                 the percent.  Valid flags are as follows:
  3181.  
  3182.                 - (minus)
  3183.                     causes the result to be left-justified within the
  3184.                     field specified by width or within the default width.
  3185.  
  3186.                 + (plus)
  3187.                     causes a plus or minus sign to be placed before the
  3188.                     result.  This flag is used in conjunction with the
  3189.                     various numeric conversion types.  If it is absent,
  3190.                     the sign character is generated only for a negative
  3191.                     number.
  3192.  
  3193.                 blank
  3194.                     causes a leading blank for a positive number and a
  3195.                     minus sign for a negative number.  This flag is
  3196.                     similar to the plus.  If both the plus and the blank
  3197.                     flags are present, the plus takes precedence.
  3198.  
  3199.  
  3200.                                  - Page 45 -
  3201. 83.    sprintf
  3202.  
  3203.                 # (pound)
  3204.                     causes special formatting.  With the o, x, and X
  3205.                     types, the pound flag prefixes any nonzero output with
  3206.                     0, 0x, or 0X, respectively.  With the f, e, and E
  3207.                     conversion types, the pound flag forces the result to
  3208.                     contain a decimal point.  With the g and G types, the
  3209.                     pound flag forces the result to contain a decimal
  3210.                     point and retain trailing zeroes.
  3211.  
  3212.                 0 (zero)
  3213.                     pads the field width with leading zeros instead of
  3214.                     spaces for the d, i, o, u, x, X, e, E, f, g, and G
  3215.                     conversion types.  If the minus flag is also used, the
  3216.                     zero flag is ignored.  If a precision is specified,
  3217.                     the zero flag is ignored for conversion types d, i, o,
  3218.                     u, x, and X.  Behavior of the zero flag is undefined
  3219.                     for the remaining conversion types.
  3220.  
  3221.             width
  3222.                 specifies the field width, which is the minimum number of
  3223.                 characters to be generated for this format item.
  3224.  
  3225.                 The width is a nonnegative number that specifies the
  3226.                 minimum field width.  If fewer characters are generated by
  3227.                 the conversion operation, the result is padded on the left
  3228.                 or right (depending on the minus flag described above).  A
  3229.                 blank is used as the padding character unless width begins
  3230.                 with a zero.  In that case, zero padding is performed.  If
  3231.                 the minus flag appears, padding is performed with blanks.
  3232.                 width specifies the minimum field width, and it will not
  3233.                 cause lengthy output to be truncated.  Use the precision
  3234.                 specifier for that purpose.
  3235.  
  3236.                 If you do not want to specify the field width as a
  3237.                 constant in the format string, you can code it as an
  3238.                 asterisk (*), with or without a leading zero.  The
  3239.                 asterisk indicates that the width value is an integer in
  3240.                 the argument list. See the examples for more information
  3241.                 on this technique. If the asterisk is followed by a $ sign
  3242.                 and a digit 1-9, you can specify which argument that holds
  3243.                 the width.
  3244.  
  3245.             precision
  3246.                 specifies the field precision, which is the required
  3247.                 precision of numeric conversions or the maximum number of
  3248.                 characters to be copied from a string, depending on the
  3249.                 type field.
  3250.  
  3251.                 The meaning of the precision item depends on the field
  3252.                 type, as follows:
  3253.  
  3254.                  Type                  Meaning
  3255.                  ----                  -------
  3256.                   c                    The precision item is ignored.
  3257.                   b, d, i, o, u, x, X  The precision is the minimum number
  3258.                                        of digits to appear.  If fewer
  3259.                                        digits are generated, leading
  3260.                                        zeroes are supplied.
  3261.                   s                    The precision is the maximum number
  3262.                                        of characters to be copied from the
  3263.                                        string.
  3264.  
  3265.                 As with the width item, you can use an asterisk for the
  3266.                 precision to indicate that the value should be picked up
  3267.                 from the next argument.
  3268.  
  3269.             size
  3270.  
  3271.                                  - Page 46 -
  3272. 83.    sprintf
  3273.  
  3274.                 Not used by FPL, though all the ANSI C modifiers are still
  3275.                 read and ignored for compatibility.
  3276.                 (Can be either L for long double, l for large size, or h
  3277.                 for small size.)
  3278.  
  3279.             type
  3280.                 specifies the type of argument conversion to be done.
  3281.                 Valid conversion types are as follows:
  3282.  
  3283.                     b
  3284.                         specifies binary-integer conversion. The
  3285.                         associated argument is taken as an unsigned
  3286.                         integer, and it is converted to a string of binary
  3287.                         digits.  This conversion type is an extension to
  3288.                         the ANSI standard.
  3289.                     c
  3290.                         specifies single-character conversion. The
  3291.                         associated argument must be an integer.  The
  3292.                         single character in the right-most byte of the
  3293.                         integer is copied to the output.
  3294.                     d
  3295.                         specifies decimal-integer conversion. The
  3296.                         associated argument must be an integer, and the
  3297.                         result is a string of digits preceded by a sign.
  3298.                         If the plus and blank flags are absent, the sign
  3299.                         is produced only for a negative integer.
  3300.                     i
  3301.                         specifies decimal-integer conversion. The
  3302.                         associated argument must be an integer, and the
  3303.                         result is a string of digits preceded by a sign.
  3304.                         If the plus and blank flags are absent, the sign
  3305.                         is produced only for a negative integer.
  3306.                     n
  3307.                         specifies the argument will be a pointer to an
  3308.                         integer into which is written the number of
  3309.                         characters written so far by this call to the
  3310.                         sprintf function.
  3311.                     o
  3312.                         specifies octal-integer conversion. The
  3313.                         associated argument is taken as an unsigned
  3314.                         integer, and it is converted to a string of octal
  3315.                         digits.
  3316.                     p
  3317.                         specifies pointer conversion.  The associated
  3318.                         argument is taken as a data pointer, and it is
  3319.                         converted to hexadecimal representation.  Under
  3320.                         AmigaDOS, the pointer is printed as 8 hexadecimal
  3321.                         digits, with leading zeroes if necessary.
  3322.                     P
  3323.                         specifies pointer conversion. This is the same as
  3324.                         the p format, except that uppercase letters are
  3325.                         used as hexadecimal digits. This conversion type
  3326.                         is an extension to the ANSI standard.
  3327.                     s
  3328.                         specifies string conversion. The associated argument
  3329.                         must be a string!
  3330.                     u
  3331.                         specifies unsigned decimal integer conversion.
  3332.                         The associated argument is taken as an unsigned
  3333.                         integer, and it is converted to a string of
  3334.                         decimal digits.
  3335.                     x
  3336.                         specifies hexadecimal-integer conversion.  The
  3337.                         associated argument is taken as an unsigned
  3338.                         integer, and it is converted to a string of
  3339.                         hexadecimal digits with lowercase letters.
  3340.                     X
  3341.  
  3342.                                  - Page 47 -
  3343. 83.    sprintf
  3344.  
  3345.                         specifies hexadecimal-integer conversion.  This is
  3346.                         the same as the x format, except that uppercase
  3347.                         letters are used as hexadecimal digits.
  3348.  
  3349. RETURNS
  3350.  
  3351.         This function returns the formatted string.
  3352.  
  3353. EXAMPLE
  3354.  
  3355.         /* This example prints a message indicating whether */
  3356.         /* the function argument is positive or negative.   */
  3357.         /* In the second sprintf, the width and precision   */
  3358.         /* are 15 and 8, respectively.                      */
  3359.         string pneg(int value)
  3360.         {
  3361.             string sign;
  3362.  
  3363.             if (value < 0) {
  3364.               sign = "negative";
  3365.             }
  3366.             else {
  3367.               sign = "not negative";
  3368.             }
  3369.             return sprintf("The number %d is %s.n",value,sign);
  3370.         }
  3371.  
  3372.         Output(pneg(37));
  3373.         Output(pneg(-18));
  3374.  
  3375.         /* This example outputs 12 and 8 in reversed order by using the
  3376.            specified argument number syntax: */
  3377.  
  3378.         Output( sprintf( " %$2d %$1d ", 12, 8 ) );
  3379.  
  3380. 84.    strcmp
  3381.  
  3382. SYNTAX  int strcmp ( String1, String2 );
  3383.  
  3384.         int stricmp ( String1, String2 );
  3385.  
  3386. DESCRIPTION
  3387.         strcmp lexicographically compares the string in the String1
  3388.         parameter to the string in the String2 parameter. stricmp() does
  3389.         the same but does a case insensitive compare, which makes uppercase
  3390.         letters equal their lowercase correspondance.
  3391.  
  3392.         Case insensitive means that the strings "HELLO" and "hello" are
  3393.         treated as identical.
  3394.  
  3395. INPUTS  string String1, String2;
  3396.  
  3397. RETURNS
  3398.         strcmp and stricmp return values that are:
  3399.  
  3400.         Less than 0 (zero) if String1 is less than String2
  3401.         Equal to 0 (zero) if String1 is equal to String2
  3402.         Greater than 0 (zero) if String1 is greater than String2.
  3403.  
  3404. SEE     strncmp and strnicmp
  3405.  
  3406. 85.    strlen
  3407.  
  3408. SYNTAX  int strlen( String );
  3409.  
  3410. DESCRIPTION
  3411.         Returns the length of the string String.
  3412.  
  3413.                                  - Page 48 -
  3414. 85.    strlen
  3415.  
  3416.  
  3417. INPUTS  string  String;
  3418.  
  3419. RETURNS
  3420.         The length of the string String.
  3421.  
  3422. 86.    strncmp
  3423.  
  3424. SYNTAX  int strncmp ( String1, String2, Num );
  3425.  
  3426.         int strnicmp ( String1, String2, Num );
  3427.  
  3428. DESCRIPTION
  3429.         The strncmp and strnicmp subroutines make the same comparisons as
  3430.         strcmp and stricmp, but they compare at most 'Num' characters.
  3431.  
  3432. INPUTS  string String1, String2;
  3433.         int Number      - Maximum number of characters to compare.
  3434.  
  3435. RETURNS
  3436.         they return values that are:
  3437.  
  3438.         Less than 0 (zero) if String1 is less than String2
  3439.         Equal to 0 (zero) if String1 is equal to String2
  3440.         Greater than 0 (zero) if String1 is greater than String2.
  3441.  
  3442. EXAMPLES
  3443.         Compare the string variable Str1 and check if it matches Str2, but
  3444.         check no more than 12 characters:
  3445.  
  3446.           if(!strncmp(Str1, Str2, 12))
  3447.             output("MATCH!");
  3448.  
  3449.         This example returns zero (0) in result.
  3450.  
  3451.           result = strncmp("realization", "really", 4);
  3452.  
  3453.         This example returns a value less than zero in result.
  3454.  
  3455.           result = strncmp("world", "worldgames", 100);
  3456.  
  3457.  
  3458. SEE     strcmp() and stricmp()
  3459.  
  3460. 87.    strstr
  3461.  
  3462. SYNTAX  int strstr( String1, String2, Column );
  3463.  
  3464.         int stristr ( String1, String2, Column );
  3465.  
  3466. DESCRIPTION
  3467.         The strstr and stristr functions find occurrences of String2 in
  3468.         String1.
  3469.  
  3470.         The 'Column' parameter can be set optionally. It specifies the start
  3471.         searching column!
  3472.  
  3473.         strstr() requires the substring to match exactly, while the stristr()
  3474.         performs a case insentive search. Case insensitive means that the
  3475.         strings "HELLO" and "hello" are treated as identical.
  3476.  
  3477. INPUTS
  3478.         string String1  - The string to search within.
  3479.  
  3480.         string String2  - The substring.
  3481.  
  3482.         int Column      - Start search column.
  3483.  
  3484.                                  - Page 49 -
  3485. 87.    strstr
  3486.  
  3487.  
  3488. RETURNS
  3489.         They return in which column they found String2 or -1 if the string
  3490.         was not found. If String2 is a 0 (zero) length string, the functions
  3491.         return 0.
  3492.  
  3493. SEE     strncmp and strnicmp, strcmp and stricmp
  3494.  
  3495. 88.    strtol
  3496.  
  3497. SYNTAX  int strtol( String, Base );
  3498.  
  3499. DESCRIPTION
  3500.           The strtol subroutine returns an integer whose value is represented
  3501.         by the character string pointed to by the String parameter. The
  3502.         strtol subroutine scans the string up to the first character that is
  3503.         inconsistent with the Base parameter. Leading white-space characters
  3504.         are ignored, and an optional sign may precede the digits.
  3505.  
  3506.           If the Base parameter is positive and not greater than 36, then it
  3507.         is used as the base for conversion. After an optional leading sign,
  3508.         leading zeros are ignored. "0x" or "0X" is ignored if Base is 16
  3509.         (sixteen).
  3510.   
  3511.           If the Base parameter is 0 (zero), the string determines the base.
  3512.         Thus, after an optional leading sign, a leading 0 (zero) indicates
  3513.         octal conversion, a leading "0x" or "0X" indicates hexadecimal
  3514.         conversion and a leading "0b" or "0B" indicates a binary conversion.
  3515.         The default is to use decimal conversion.
  3516.  
  3517. INPUTS  string String   - Character string to be converted.
  3518.         int Base        - Specifies the base to use for the conversion.
  3519.  
  3520. RETURNS
  3521.           Upon successful completion, the strtol subroutine return the
  3522.         converted value. If no conversion could be performed, 0 (zero) is
  3523.         returned. If the correct value is outside the range of representable
  3524.         values, maximum or minimum value is returned according to the sign of
  3525.         the value.
  3526.  
  3527. EXAMPLES
  3528.         Convert the string holding the hexadecimal "0xdeadbeef" to decimal:
  3529.  
  3530.           string String = "0xdeadbeef"
  3531.           int num = strtol(String, 16);
  3532.  
  3533. SEE      ltostr 
  3534.  
  3535. 89.    substr
  3536.  
  3537. SYNTAX  string substr( Source, Column, Length );
  3538.  
  3539. DESCRIPTION
  3540.         The substr function returns a substring to a destination string 
  3541.         variable. Giving a length of -1 will make substr get the rest
  3542.         of the string from the column specified.
  3543.  
  3544.         - If the substring is told to keep on beyond the end of the Source,
  3545.           the substring will end where the Source string does.
  3546.  
  3547.         - If the column parameter is below zero or larger than the length of
  3548.           the source string, a zero length string is returned.
  3549.  
  3550.         - The first column of the source is column 0 (zero).
  3551.  
  3552. INPUTS
  3553.         string Source   - The source string from which the substring
  3554.  
  3555.                                  - Page 50 -
  3556. 89.    substr
  3557.  
  3558.                           will be copied from. */
  3559.         int Column      - Start column of the substring.
  3560.         int Length      - The Length of the substring.
  3561.  
  3562. RETURNS
  3563.         The substring!
  3564.  
  3565. EXAMPLES
  3566.         Extract a substring of 3 characters from column 4 of the source
  3567.         string:
  3568.  
  3569.           string Dest;
  3570.           Dest=substr("One Two Three", 4, 3);
  3571.  
  3572.         Get the right part of a line split by the character "|":
  3573.  
  3574.           string Line="Names     |Addresses", Dest;
  3575.           int pos;
  3576.           pos=strstr(Line, "|");
  3577.           if(pos<0)                     /* if we can't find a "|" */
  3578.             exit;
  3579.  
  3580.           pos++;                        /* We don't want to include the "|"
  3581.                                            Character in our substring! */
  3582.           Dest=substr(Line,             /* The source string */
  3583.                       pos,              /* where from */
  3584.                       -1);               /* To the end of the string. */
  3585.  
  3586.         It's OK to try getting more than you will get. This example get the
  3587.         rest of the line too, but maximum 10000 characters...:
  3588.  
  3589.           Dest=substr(Line, pos, 10000);
  3590.  
  3591. SEE     strstr() and stristr()
  3592.  
  3593. 90.    Examples
  3594.  
  3595. 1. Ask the user for his age and output the number of days old he is:
  3596.  
  3597.   int a;                            /* Create an integer called "a"  */
  3598.   a=num_input("Age in years:");     /* Get age of user in variable a */
  3599.   output("Makes " a*365 " days!\n");/* Output proper text            */
  3600.  
  3601.  
  3602. 2. Ask the user for his name and output it a hundred times with spaces
  3603.    between:
  3604.  
  3605.   string name;                          /* Create a string variable */
  3606.   name=str_input("What's your name?");  /* Input name               */
  3607.   int i;                                /* Create an integer        */
  3608.   for (i=0; i<100; i++)                 /* Count 100 times          */
  3609.     output(name " ");                   /* Output the name          */
  3610.  
  3611.  
  3612. 3. Replace all form feed characters with the proper number of newlines
  3613.    to suit the page length given by the user (for guys using
  3614.    printers which by some reason don't handle form feeds):
  3615.  
  3616.   int len, i, page;                     // Create a number of ints
  3617.   len=num_input("Page length?");        // Get page length
  3618.   while(search_for("\f", "S")) {        // Search for form feed
  3619.     page=len-line()%len;                // Calc number of newlines
  3620.     for(i=0, i<page, i++)               // Count to number above
  3621.       output("\n");                     // Output a newline
  3622.   }                                     // End of while
  3623.   status("Done!");                      // Text in status line.
  3624.  
  3625.  
  3626.                                  - Page 51 -
  3627. 90.    Examples
  3628.  
  3629.  
  3630. 4. Make a nice little table with temperatures in Celsius and
  3631.    Fahrenheit. Count from 0 to 100 Celsius with ten degrees steps:
  3632.  
  3633.   int c, f;                     /* Declare two variables             */
  3634.   while(c<=100) {               /* while c less than or equal to 100 */
  3635.     output(c" degrees Celsius = ");/* output Celsius                 */
  3636.     f=c*18/10+32;               /* The formula. Made to work
  3637.                                    without floating points           */
  3638.     output(f" degrees Fahrenheit! \n"); /* output Fahrenheit result  */
  3639.     c+=10;                      /* Add ten to c.                     */
  3640.   }                             /* loop                              */
  3641.  
  3642. 5. Create a routine that make a division with an innumerable number of
  3643.    decimals:
  3644.  
  3645.   int a, b, n;                  /* Declare all variables needed     */
  3646.   a=355;                        /* Set the operands of the division */
  3647.   b=14;
  3648.   output(a " / " b " = ");      /* View the evaluation to the user  */
  3649.   output(a/b);                  /* Calculate...                     */
  3650.   if(a%b) {                     /* If there remains anything...     */
  3651.     output(".");                /* Display a dot.                   */
  3652.     for(n=0;n<100;n++) {        /* Only 100 decimals this time!     */
  3653.       a=a%b*10;                 /* Evaluate next left operator      */
  3654.       output(a/b);              /* View the next figure             */
  3655.     }
  3656.   }
  3657.   output("\n");                 /* Make an extra newline            */
  3658.  
  3659.  
  3660. 6. Perform the same task as above. This is an example program showing
  3661.    some simple moves to make the code run faster:
  3662.  
  3663.   int a=355, b=14, n;
  3664.   string s=a" / "b" = "(a/b);
  3665.   if(a%b)
  3666.     for(s+=".";n++<100;)
  3667.       s+=((a=a%b*10)/b);
  3668.   output(s"\n");
  3669.  
  3670. 7. Try out the recursive possibilities of FPL:
  3671.  
  3672.   int b;
  3673.   int label(int &);
  3674.   label(b);
  3675.   output(b"\n");
  3676.   exit;
  3677.  
  3678.   int label(int &b)
  3679.   {
  3680.     if(++b<5) {
  3681.       while(1) {{{{{{label(b);break;}}}}}}
  3682.     }
  3683.     return;
  3684.   }
  3685.  
  3686. 91.    Error messages
  3687.  
  3688. DIVISION BY ZERO
  3689.   Division by zero is not a permitted mathematical move (note that this may
  3690.   also appear with the remainder operator "%").
  3691.   See  division  or  remainder .
  3692.  
  3693. FILE
  3694.   Something about the specified file is wrong. Check the file name again.
  3695.  
  3696.  
  3697.                                  - Page 52 -
  3698. 91.    Error messages
  3699.  
  3700. IDENTIFIER NOT FOUND
  3701.   The variable or function is not found!
  3702.  
  3703. IDENTIFIER ALREADY USED
  3704.   This name is already used by an identifier. You cannot use it too!
  3705.  
  3706. ILLEGAL ARRAY
  3707.   You cannot create an array with less than one element, access elements with
  3708.   higher number than you declared it to or access negative elements. When
  3709.   using the resize keyword the variable name must already be an array.
  3710.   See  variables  or  resize .
  3711.  
  3712. ILLEGAL ASSIGN
  3713.   FPL does not support that type of  compound assignment .
  3714.  
  3715. ILLEGAL BREAK
  3716.    Break  can ONLY be used within some kind of loop ( while ,  for  or  do )
  3717.   or  switch , and this wasn't such a  statement .
  3718.  
  3719. ILLEGAL CASE
  3720.   The 'case' keyword can only be used within a switch() statement!
  3721.  
  3722. ILLEGAL CONDITION OPERATOR
  3723.   Conditional operators should be used like a ? b : c. If any of the ? or :
  3724.   characters are missing, this might become the error message!
  3725.  
  3726. ILLEGAL CONTINUE
  3727.    Continue  can ONLY be used within some kind of loop ( while ,  for  or
  3728.    do ), and this wasn't such a  statement .
  3729.  
  3730. ILLEGAL DECLARATION
  3731.   The  declaration  was not placed in the beginning of a block,
  3732.   or a function isn't declared the way it was prototyped.
  3733.  
  3734. ILLEGAL DEFAULT
  3735.   The 'default' keyword can only be used within a switch() statement!
  3736.  
  3737. ILLEGAL PROTOTYPE
  3738.   Something in the just parsed function prototype was not using
  3739.   correct syntax and/or keywords.
  3740.  
  3741. ILLEGAL REFERENCE
  3742.   A variable reference was used the wrong way!
  3743.  
  3744. ILLEGAL RESIZE
  3745.   Resizing of an array did not follow correct syntax!
  3746.  
  3747. ILLEGAL STATEMENT
  3748.   The  statement  was not allowed at this point. It might
  3749.   be a numerical expresion where a string expresion was expected or vice
  3750.   versa. It might also be a statement that cannot be placed here.
  3751.  
  3752. ILLEGAL STRING INDEX
  3753.   Trying to read a negative column off a string will most likely cause this.
  3754.  
  3755. ILLEGAL VARIABLE TYPE
  3756.   You mixed  string  and  integer  variables/ expressions illegally
  3757.   or you tried to send to wrong kind of variable to a function.
  3758.  
  3759. INTERNAL ERROR
  3760.   The library's internal data/structures has not been handled properly by
  3761.   the coder of the software you're using. Report this immediately to
  3762.   him/her. (See the docs of the software you're controlling with FPL.) This
  3763.   is not the FPL programmer's fault.
  3764.  
  3765. INSIDE FUNCTION NOT FOUND
  3766.   A function that has been prototyped to be an `inside' function was not
  3767.  
  3768.                                  - Page 53 -
  3769. 91.    Error messages
  3770.  
  3771.   found!
  3772.   Notice that the function *MUST* be prototyped and declared the same way. A
  3773.   function prototyped as `int' but declared as `void', will *NOT* be found by
  3774.   the FPL interpreter!
  3775.  
  3776. INCOMPLETE STATEMENT
  3777.   The  statement  just parsed did not include a required action such as a
  3778.   variable change or a function call.
  3779.  
  3780. MISSING APOSTROPHE
  3781.   The program most likely contains a character within single quotes ('),
  3782.   where the following quote is missing.
  3783.  
  3784. MISSING ARGUMENT
  3785.   The  function / keyword  you tried to invoke, requires more arguments!
  3786.   (Or refer to the docs of the software you're controlling with FPL.)
  3787.  
  3788. MISSING BRACE
  3789.   Some places just require braces. I.e block statements that have an initial
  3790.   brace or Array assigns that must end with a close
  3791.   brace.
  3792.  
  3793. MISSING BRACKET
  3794.   Array references and other need an open bracket ([) and a close bracket
  3795.   (]).
  3796.  
  3797. MISSING COLON
  3798.   There should be a colon (:) here, but it's not!
  3799.  
  3800. MISSING OPERAND
  3801.   Making an expression that starts with an operator most likely causes this
  3802.   error.
  3803.  
  3804. MISSING PARENTHESES
  3805.   The statement just interpreted had a lack of parenthesis.
  3806.  
  3807. MISSING SEMICOLON
  3808.   All statements must be separated with semicolons. This wasn't!
  3809.  
  3810. MISSING WHILE
  3811.   There is a missing 'while' keyword after the do-while statement!
  3812.  
  3813. OUT OF MEMORY
  3814.   The system has run out of memory. This isn't your fault, and there is
  3815.   nothing you can do about it but decrease memory usage. Note that if *any*
  3816.   internal FPL allocation call fails, the program stops with this error code.
  3817.  
  3818. OUT OF STACK
  3819.   The stack size hit the roof. The program is too recursive!
  3820.  
  3821. PARAMETER IS OUT OF RANGE
  3822.   The parameter(s) specified must be within a certain range, which you
  3823.   clearly did not manage. (Refer to the docs of the action you just tried.)
  3824.  
  3825. PROGRAM STOPPED
  3826.   The program was stopped by a force outside the library. This is not
  3827.   a real error message but more like information.
  3828.  
  3829. READ ONLY VIOLATION
  3830.   You tried changing the contents of a read-only variable.
  3831.  
  3832. SYNTAX ERROR
  3833.   Severe error in your writing. Rethink and try again. All  functions ,
  3834.   labels or variable  identifiers MUST start with a letter .
  3835.  
  3836. TOO MANY PARAMETERS
  3837.   Either a function is called with too many parameters, or there is a missing
  3838.  
  3839.                                  - Page 54 -
  3840. 91.    Error messages
  3841.  
  3842.   paranthesis after the parameters.
  3843.  
  3844. UNBALANCED COMMENT
  3845.   There is no corresponding end of comment.
  3846.  
  3847. UNEXPECTED END OF PROGRAM
  3848.   The program ended where it wasn't supposed to! Probable cause is a
  3849.   lack of closing comment sign or lack of a closing paren of some kind.
  3850.  
  3851. UNEXPECTED INTEGER STATEMENT
  3852.   The interpreter expected a string expression, but read an integer one.
  3853.  
  3854. UNEXPECTED STRING STATEMENT
  3855.   The interpreter expected an integer expression, but read a string one.
  3856.  
  3857. UNKNOWN
  3858.   The programmer of the host software sent a strange error code to FPL which
  3859.   there is no corresponding error message to!
  3860.  
  3861. UNMATCHED BRACE
  3862.   This brace has no corresponding one.
  3863.  
  3864.  
  3865.  
  3866.  
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.  
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.  
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.  
  3898.  
  3899.  
  3900.  
  3901.  
  3902.  
  3903.  
  3904.  
  3905.  
  3906.  
  3907.  
  3908.  
  3909.  
  3910.                                  - Page 55 -
  3911. 91.    Error messages
  3912.  
  3913.  
  3914. 92.    INDEX of sections
  3915.  
  3916. About this manual ..................................................   1. 42
  3917. abs ................................................................  40.  2
  3918. Addition + .........................................................  21.  1
  3919. Assignment expressions .............................................  25.  4
  3920. atoi ...............................................................  40. 13
  3921. Binary expressions .................................................  20.  3
  3922. Bitwise AND & ......................................................  22. 39
  3923. Bitwise Exclusive OR ^ .............................................  22. 55
  3924. Bitwise inclusive OR | .............................................  23.  4
  3925. Bitwise left and right shift << >> .................................  21.  9
  3926. Bitwise negation ~ .................................................  19. 50
  3927. Blockstatement .....................................................  13. 20
  3928. break ..............................................................  27. 13
  3929. case ...............................................................  28.  1
  3930. char ...............................................................  28. 40
  3931. closelib ...........................................................  40. 35
  3932. Comma expressions ..................................................  25. 63
  3933. Compound assignment ................................................  25. 26
  3934. Conditional expressions ............................................  24. 14
  3935. Constants ..........................................................  12. 54
  3936. continue ...........................................................  28. 56
  3937. debug     ..........................................................  30. 22
  3938. Declare inside functions ...........................................  10.  1
  3939. Decrement -- .......................................................  19. 19
  3940. default ............................................................  29. 27
  3941. Division / .........................................................  20. 40
  3942. do .................................................................  29. 59
  3943. else ...............................................................  30. 48
  3944. Equality == != .....................................................  22. 15
  3945. Error messages .....................................................  51. 56
  3946. eval ...............................................................  40. 60
  3947. Examples ...........................................................  50. 34
  3948. exit ...............................................................  31. 27
  3949. export .............................................................  31. 47
  3950. Expression statement ...............................................  14. 36
  3951. for ................................................................  31. 63
  3952. FPL Users Documentation ............................................   1.  0
  3953. Funclibs ...........................................................   3. 56
  3954. Function calls .....................................................  18. 23
  3955. Functions ..........................................................   9. 46
  3956. General ............................................................   2. 37
  3957. General function use ...............................................  11. 38
  3958. Grouping and evaluating ............................................  16. 44
  3959. Hints and tricks ...................................................  15. 42
  3960. How to reach me ....................................................   2.  1
  3961. if .................................................................  33. 24
  3962. Increment ++ .......................................................  18. 58
  3963. int ................................................................  34. 24
  3964. interpret ..........................................................  41. 10
  3965. itoa ...............................................................  42.  9
  3966. itoc ...............................................................  42. 33
  3967. joinstr ............................................................  42. 56
  3968. Keywords ...........................................................  14. 62
  3969. Line Control .......................................................   4. 16
  3970. Logical AND && .....................................................  23. 21
  3971. Logical negation ! .................................................  19. 39
  3972. Logical OR || ......................................................  23. 51
  3973. ltostr .............................................................  43.  8
  3974. Multiplication * ...................................................  20. 26
  3975. Null statement .....................................................  14. 24
  3976. Numeric expressions (and operators) ................................  16. 27
  3977. openlib ............................................................  43. 35
  3978. Parenthesized Expressions ..........................................  18.  4
  3979. Pragmas in FPL .....................................................   4. 58
  3980.  
  3981.                                  - Page 56 -
  3982. 92.    INDEX of sections
  3983.  
  3984. Primary expressions ................................................  17. 61
  3985. Relational < > <= >= ...............................................  21. 47
  3986. Remainder % ........................................................  20. 56
  3987. resize .............................................................  34. 48
  3988. return .............................................................  35. 40
  3989. short ..............................................................  36.  2
  3990. Simple assignment = ................................................  25. 15
  3991. sprintf ............................................................  44.  4
  3992. Statements .........................................................  14.  8
  3993. strcmp .............................................................  47. 34
  3994. string .............................................................  36. 16
  3995. Strings ............................................................   8. 40
  3996. strlen .............................................................  47. 60
  3997. strncmp ............................................................  48.  5
  3998. strstr .............................................................  48. 43
  3999. strtol .............................................................  49.  7
  4000. substr .............................................................  49. 47
  4001. Subtraction - ......................................................  21.  5
  4002. switch .............................................................  37. 39
  4003. typedef ............................................................  37. 22
  4004. Unary Expression ...................................................  18. 43
  4005. Unary minus - ......................................................  19. 30
  4006. Unary plus + .......................................................  19. 23
  4007. Variables ..........................................................   5. 22
  4008. while ..............................................................  38. 49
  4009.  
  4010. 93.    INDEX of keywords
  4011.  
  4012.  ++ operator  ......................................................  19. 22
  4013.   i ................................................................  36. 23
  4014.  About this manual  ................................................   1. 30
  4015.  abs        ........................................................  39. 43
  4016.  Addition +              ...........................................  20. 13
  4017.  Additive              .............................................  17. 11
  4018.  Assignment            .............................................  17. 21
  4019.  Assignment expressions   ..........................................  16. 41
  4020.  atoi       ........................................................  39. 44
  4021.  auto      .........................................................  26. 46
  4022.  Binary Expressions       ..........................................  16. 40
  4023.  Bitwise AND &           ...........................................  20. 14
  4024.  Bitwise Exclusive OR  .............................................  17. 16
  4025.  Bitwise Exclusive OR ^  ...........................................  20. 15
  4026.  Bitwise Inclusive OR  .............................................  17. 17
  4027.  Bitwise Inclusive OR |  ...........................................  20. 16
  4028.  Bitwise Logical AND   .............................................  17. 15
  4029.  Bitwise Negation ~  ...............................................  18. 52
  4030.  Bitwise Shift         .............................................  17. 12
  4031.  Bitwise Shift << >>     ...........................................  20. 17
  4032.  Block       .......................................................  14. 13
  4033.  break  ............................................................  15. 19
  4034.  break     .........................................................  26. 47
  4035.  break       .......................................................  14. 14
  4036.  case  .............................................................  29. 58
  4037.  case      .........................................................  26. 48
  4038.  char  .............................................................  15. 28
  4039.  char    ...........................................................  34. 47
  4040.  char      .........................................................  26. 49
  4041.  closelib()  .......................................................  43. 48
  4042.  closelib  .........................................................   4. 12
  4043.  closelib   ........................................................  39. 65
  4044.  Comma                 .............................................  17. 22
  4045.  Comma expressions        ..........................................  16. 43
  4046.  comma operator  ...................................................  16. 65
  4047.  compound  .........................................................  16.  7
  4048.  compound assignment  ..............................................  25. 14
  4049.  Conditional           .............................................  17. 20
  4050.  Conditional Expressions  ..........................................  16. 42
  4051.  
  4052.                                  - Page 57 -
  4053. 93.    INDEX of keywords
  4054.  
  4055.  const     .........................................................  26. 50
  4056.  Constants                ..........................................  16. 34
  4057.  continue  .........................................................  15. 17
  4058.  continue    .......................................................  14. 15
  4059.  debug     .........................................................  26. 52
  4060.  declaration  ......................................................  52. 31
  4061.  Decrement --        ...............................................  18. 53
  4062.  default  ..........................................................  28. 39
  4063.  default   .........................................................  26. 53
  4064.  division  .........................................................  20. 59
  4065.  Division /              ...........................................  20. 18
  4066.  do  ...............................................................  15.  7
  4067.  do        .........................................................  26. 54
  4068.  do          .......................................................  14. 16
  4069.  else  .............................................................  15.  9
  4070.  Equality              .............................................  17. 14
  4071.  Equality == !=          ...........................................  20. 19
  4072.  Error messages     ................................................   1. 31
  4073.  eval  .............................................................  42.  8
  4074.  eval       ........................................................  39. 45
  4075.  Examples           ................................................   1. 32
  4076.  exit  .............................................................  15. 41
  4077.  exit      .........................................................  26. 55
  4078.  export  ...........................................................  15. 34
  4079.  expression1  ......................................................  15. 11
  4080.  expression2  ......................................................  15. 11
  4081.  expression3  ......................................................  15. 11
  4082.  Expression  .......................................................  14. 17
  4083.  expressions .......................................................  52. 56
  4084.  Expressions        ................................................   1. 17
  4085.  for  ..............................................................  15. 11
  4086.  for       .........................................................  26. 56
  4087.  for         .......................................................  14. 18
  4088.  FPL implementation   ..............................................   1. 41
  4089.  funclib  ..........................................................  40. 41
  4090.  funclibs  .........................................................  40. 59
  4091.  Funclibs           ................................................   1. 26
  4092.  function  .........................................................  53. 14
  4093.  Function calls  ...................................................  18.  3
  4094.  functions  ........................................................   2. 55
  4095.  Functions          ................................................   1. 18
  4096.  General            ................................................   1. 16
  4097.  general function usage  ...........................................   9. 50
  4098.  General information  ..............................................   1. 38
  4099.  Grouping and evaluating  ..........................................  16. 36
  4100.  Grouping and Evaluating FPL Expressions  ..........................  17. 65
  4101.  Hints and tricks   ................................................   1. 33
  4102.  How to reach us    ................................................   1. 34
  4103.  identifiers MUST start with a letter  .............................  53. 63
  4104.  if  ...............................................................  15. 24
  4105.  if        .........................................................  26. 57
  4106.  if          .......................................................  14. 19
  4107.  Increment ++        ...............................................  18. 54
  4108.  Inside functions  .................................................   9. 60
  4109.  int  ..............................................................  15. 28
  4110.  int     ...........................................................  28. 53
  4111.  int       .........................................................  26. 58
  4112.  integer  ..........................................................  52. 56
  4113.  integer variable  .................................................  12. 34
  4114.  Internal functions  ...............................................   9. 65
  4115.  interpret  ........................................................  39. 46
  4116.  itoa  .............................................................  42. 55
  4117.  itoa       ........................................................  39. 47
  4118.  itoc       ........................................................  39. 48
  4119.  joinstr    ........................................................  39. 49
  4120.  keyword  ..........................................................  53. 14
  4121.  keyword reference  ................................................  14. 65
  4122.  
  4123.                                  - Page 58 -
  4124. 93.    INDEX of keywords
  4125.  
  4126.  keywords  .........................................................   2. 55
  4127.  Keywords           ................................................   1. 19
  4128.  Line control       ................................................   1. 20
  4129.  Logical AND &&          ...........................................  20. 20
  4130.  Logical AND           .............................................  17. 18
  4131.  Logical Negation !  ...............................................  18. 55
  4132.  Logical OR            .............................................  17. 19
  4133.  Logical OR ||           ...........................................  20. 21
  4134.  long  .............................................................  15. 28
  4135.  long      .........................................................  26. 59
  4136.  ltostr  ...........................................................  49. 46
  4137.  ltostr     ........................................................  39. 50
  4138.  More variable declaration details  ................................  15. 37
  4139.  Multiplication *        ...........................................  20. 22
  4140.  Multiplicative        .............................................  17. 10
  4141.  Null        .......................................................  14. 20
  4142.  numerical expressions  ............................................  12. 26
  4143.  openlib()  ........................................................  40. 46
  4144.  openlib  ..........................................................   4.  9
  4145.  openlib    ........................................................  39. 64
  4146.  outputs all ASCII c ...............................................  36. 26
  4147.  Parenthesized Expressions  ........................................  18.  2
  4148.  Pragmas            ................................................   1. 24
  4149.  precedence  .......................................................  18. 48
  4150.  primary  ..........................................................  16. 64
  4151.  Primary               .............................................  17.  8
  4152.  Primary Expressions      ..........................................  16. 38
  4153.  register  .........................................................  26. 60
  4154.  Relational            .............................................  17. 13
  4155.  Relational < > <= >=    ...........................................  20. 23
  4156.  remainder  ........................................................  20. 52
  4157.  Remainder %             ...........................................  20. 24
  4158.  remainder operator  ...............................................   5. 56
  4159.  resize  ...........................................................  15. 32
  4160.  resize    .........................................................  26. 61
  4161.  return  ...........................................................  15. 41
  4162.  return    .........................................................  26. 62
  4163.  return      .......................................................  14. 21
  4164.  short  ............................................................  15. 28
  4165.  short   ...........................................................  28. 54
  4166.  short     .........................................................  26. 63
  4167.  simple assignment  ................................................  25. 13
  4168.  sprintf    ........................................................  39. 51
  4169.  statement  ........................................................  15.  7
  4170.  Statements  .......................................................  11. 32
  4171.  Statements         ................................................   1. 21
  4172.  static    .........................................................  26. 64
  4173.  strcmp     ........................................................  39. 52
  4174.  stricmp    ........................................................  39. 53
  4175.  string  ...........................................................  15. 30
  4176.  string    .........................................................  26. 65
  4177.  string handlings  .................................................  16. 12
  4178.  string variable  ..................................................  12. 32
  4179.  Strings            ................................................   1. 22
  4180.  stristr    ........................................................  39. 58
  4181.  strlen     ........................................................  39. 54
  4182.  strncmp    ........................................................  39. 55
  4183.  strnicmp   ........................................................  39. 56
  4184.  strstr     ........................................................  39. 57
  4185.  strtol     ........................................................  39. 59
  4186.  substr     ........................................................  39. 60
  4187.  Subtraction -           ...........................................  20. 25
  4188.  switch  ...........................................................  28.  0
  4189.  switch    .........................................................  26. 66
  4190.  switch      .......................................................  14. 22
  4191.  typedef   .........................................................  27.  0
  4192.  Unary                 .............................................  17.  9
  4193.  
  4194.                                  - Page 59 -
  4195. 93.    INDEX of keywords
  4196.  
  4197.  Unary Expressions        ..........................................  16. 39
  4198.  Unary Minus -       ...............................................  18. 56
  4199.  Unary Plus +        ...............................................  18. 57
  4200.  variable assigns  .................................................  16.  7
  4201.  variables  ........................................................  52. 10
  4202.  Variables          ................................................   1. 23
  4203.  volatile  .........................................................  27.  1
  4204.  while  ............................................................  15.  9
  4205.  while     .........................................................  27.  2
  4206.  while       .......................................................  14. 23
  4207. Array assigns ......................................................  53. 19
  4208. atoi() .............................................................  42. 32
  4209. char ...............................................................  36. 15
  4210. Conditional operators ..............................................  52. 23
  4211. continue ...........................................................  33. 23
  4212. do .................................................................  33. 23
  4213. do-while ...........................................................  53. 40
  4214. er) and ............................................................  36. 23
  4215. eval() .............................................................   9. 45
  4216. examp ..............................................................  36. 26
  4217. function reference .................................................   9. 44
  4218. int  ...............................................................  36. 15
  4219. integer expression .................................................  54. 13
  4220. itoa() .............................................................  40. 34
  4221. ltostr() ...........................................................  42. 32
  4222. read-only variable .................................................  53. 59
  4223. Resizing ...........................................................  52. 45
  4224. statement ..........................................................  53. 34
  4225. statements .........................................................  53. 37
  4226. strcmp() ...........................................................   9. 45
  4227. strcmp() and stricmp() .............................................  48. 42
  4228. strcmp and stricmp .................................................  49.  6
  4229. string .............................................................  36. 15
  4230. string expression ..................................................  54. 10
  4231. stristr() ..........................................................  50. 33
  4232. strncmp() ..........................................................   9. 45
  4233. strncmp and strnicmp ...............................................  47. 59
  4234. strstr() ...........................................................  50. 33
  4235. strtol() ...........................................................  40. 34
  4236. substr() ...........................................................   9. 45
  4237. switch() ...........................................................  52. 20
  4238. variables. .........................................................  36.  9
  4239. while ..............................................................  33. 23
  4240.